home *** CD-ROM | disk | FTP | other *** search
/ Joystick Magazine 1996 May / cd joy 71No13.iso / pc / demos / eurosoc / source / 3deng.c < prev    next >
C/C++ Source or Header  |  1996-03-17  |  267KB  |  10,043 lines

  1.  
  2. /********************************************************/                                                         
  3. /*           3D ENGINE - Football   13/04/95                */
  4. /********************************************************/
  5.  
  6. // By Laurent Noel
  7.  
  8. #include "defs.h"
  9.  
  10. /********************* HEADER FILES *********************/
  11.  
  12. #include <stdlib.h>
  13. #include <stdio.h>
  14. #include <malloc.h>
  15. #include <math.h>
  16. #include <string.h>
  17. #include <conio.h>
  18. #include <i86.h>
  19. #include <io.h>
  20. #include <fcntl.h>
  21. #include <direct.h>
  22. #include <time.h>
  23. #include <sys\stat.h>
  24. #include "c:\sos\include\sos.h"
  25. #include "c:\cgl\cgl.h"
  26.  
  27. #include "3deng.h"
  28. #include "data.h"
  29. #include "vesa.h"
  30. #include "mallocx.h"
  31.  
  32. #ifdef BLASTER
  33. #include "3dblast.h"
  34. #else
  35. #include "3dbnull.h"
  36.  
  37. #ifdef NEW
  38. #include "eurodefs.h"
  39. #include "euro_fxd.h"
  40. #include "euro.equ"
  41. #include "euro_sym.h"
  42. #include "euro_def.h"
  43. //#include "euro_var.h"
  44. #include "euro_mem.h"
  45. #include "euro_spt.h"
  46. #include "euro_gen.h"
  47. #include "euro_grf.h"
  48. #include "euro_cnt.h"
  49. #include "euro_dsk.h"
  50. #include "euro_sqd.h"
  51. #include "euro_sel.h"
  52. #include "euro_fix.h"
  53. #include "euro_usr.h"
  54. #include "euro_inf.h"
  55. #include "euro_gdv.h"
  56. #include "euro_win.h"
  57. //#include "euro_net.h"
  58. #include "euro_cmd.h"
  59. #include "euro_rnd.h"
  60. #include "euro_int.h"
  61. #endif
  62.  
  63. #define        TEMPa        0
  64. #define        TEMPb        1
  65.  
  66.  
  67.  
  68. #endif
  69.  
  70. #ifdef JAPAN
  71. #include "actrend.equ"
  72. #include "fapj.equ"
  73. #include "files.c"
  74. #else
  75. #ifndef FLOPPY
  76. #include "actrend.equ"
  77. #include "fap.equ"
  78. #include "files.c"
  79. #else
  80. #ifndef BBS
  81. #include "actrendf.equ"
  82. #include "fapf.equ"
  83. #include "filesf.c"
  84. #else
  85. #include "actrendb.equ"
  86. #include "fapf.equ"
  87. #include "filesb.c"
  88. #endif
  89. #endif
  90. #endif
  91.  
  92. #include "fgfx.c"
  93.  
  94. #include "andydefs.h"
  95. #include "defines.h"
  96.  
  97.                                          
  98. /***************** PRE-DEFINED CONSTANTS ****************/
  99.  
  100. #define SCREENDIST 15    // Screen clip plane z distance, set to avoid overflow
  101. #define CUTOFFDIST 5        // Cutoff plane z distance (can be -ve!), set for nearest visibility
  102.  
  103. #define MAXOBJ    100        // Max number of objects in one sort
  104. #define MAXPOL 1000        // Max number of polys in one sort
  105. #define MAXPTS 500        // Max number of points in one object
  106. #define MAXLOOP 100         // Max number of looping maps
  107.  
  108. #define MAX_FILES 500
  109.  
  110. // Undefined in C++ (?!)
  111. #define min(a,b) (((a)<(b))?(a):(b))
  112. #define max(a,b) (((a)>(b))?(a):(b))
  113. #define abs(a) (((a)>=0)?(a):-(a))
  114.  
  115.  
  116.  
  117. /*********************** PROTOTYPES *********************/
  118.  
  119. // From render.c :
  120.  
  121. // Line Drawing
  122. extern void line(pnt *pts,word col);                    // Flat colour line
  123. // Polygon drawing
  124. extern void poly(pnt *pts,word np,word col);            // Flat colour overlapping
  125. extern void polyb(pnt *pts,word np,word col);        // Flat colour
  126. extern void polyf(pnt *pts,word np,filter col);        // Filtered
  127. extern void polyg(ppnt *pts,word np);                    // Gourad shading
  128. extern void polym(pnt *pts,word np,word mapsel,        // Texture mapped
  129.                   dword *startsx,dword *startsy);    
  130. extern void polyl(pnt *pts,word np,word mapsel,        // Looping texture mapped
  131.                   dword *startsx,dword *startsy);
  132. extern void polyt(pnt *pts,word np,word mapsel,        // Transparent texture mapped
  133.                   dword *startsx, dword *startsy);    
  134. extern void polyq(zpnt *pts,word np,BYTE *map,        // Bi-Quadratic texture mapped
  135.                   dword *startsx, dword *startsy); 
  136. extern void sprite3d(short x,short y,short ref);    // Depth sorted sprites
  137.  
  138. // Dumps for various buffer types
  139. void dumpMCGA(scrpt dispx,scrpt dispy);
  140. void dumpMCGAs(scrpt dispx,scrpt dispy);
  141. void dumpV256(scrpt dispx,scrpt dispy);
  142. void dump3DB(scrpt dispx,scrpt dispy);
  143. void dumpvidi1(scrpt dispx,scrpt dispy);
  144. void dumpnull(scrpt dispx,scrpt dispy);
  145.  
  146. // Miscellaneous
  147. extern int w95;                // Are we in Windows 95 (AAAARRRRRGGGGHHHHH!!!!)
  148. extern float log_factor;    // No of logic frames/update
  149. extern int testVESA;
  150. extern char match_half;
  151. extern char match_mode;
  152.  
  153.  
  154. void draw_sprite(buff_info *buff,int sprite_no,int x,int y,BYTE col);
  155. int draw_string(buff_info *buff,int font_no,int x,int y,char *string,BYTE col,short just);
  156.  
  157. #ifdef LINK
  158. extern "C" char keys[128];        // Key pressed array (indexed by scan-code)
  159. extern "C" char key_togs[128];// Key toggled array (indexed by scan-code)
  160. extern "C" int icth,isth;        // Integer cos and sin of theta
  161. extern "C" volatile int count;// Timer count
  162. extern "C" network_on;            // Network game
  163. #else
  164. extern char keys[128];        // Key pressed array (indexed by scan-code)
  165. extern char key_togs[128];    // Key toggled array (indexed by scan-code)
  166. extern int icth,isth;        // Integer cos and sin of theta
  167. extern volatile int count;    // Timer count
  168. extern network_on;            // Network game
  169. #endif
  170.  
  171. // Wind data
  172. extern short wind_on;
  173. extern float wind_x,wind_y;
  174. extern float wind_speed;
  175.  
  176.  
  177. /********************** GLOBAL VARS *********************/
  178.  
  179. // Setup data
  180. setup_info setup;                // Initialisation data
  181. int performance;                 // Machine performance index
  182.  
  183. // Screen buffer info
  184. buff_info main_buff;            // Current main screen buffer info
  185. buff_info vidi_buff;        // Current vidi-buffer info
  186. buff_info menu_buff;        // Current menu buffer info
  187. buff_info_ext render_buff;    // Extended buffer info for rendering
  188. word scrmode;                    // (S)VGA mode number (including VESA)
  189. word scrmode3DB;                // 3D Blaster mode number (-ve if not available)
  190. CGL_COLOR_ST backcol={199,199,199,0};    // 3D Blaster background colour (temporary)
  191. word menx3DB,meny3DB;        // Offset for menus on 3D Blastter
  192. int mappages;                    // No of texture-map pages being used
  193.  
  194. int texaddr3DB[16];            // Internal 3DB addresses for gfx
  195. int skyaddr3DB,pitchaddr3DB;    // Internal 3DB addresses for gfx
  196.  
  197. BYTE *scr=(BYTE *)0xa0000;    // Address of (S)VGA display.
  198.  
  199. // Viewpoint vars
  200. floatpt cth,sth,cph,sph;    // Cos & sin of theta and phi, the viewing angles
  201. short q,oq;                        // Perspective scaling
  202. floatpt qr,qa;                    // Precalculations derived from above
  203. floatpt scrdr,persc;            // Used for 'alternative perspective scaling', see below
  204. qmat rot,tran;                    // Quick matrices for view and object rotation
  205.  
  206. // Object/polygon/point lists
  207. objs *objlist;        // List of objects [object z, object polygon list]
  208. objs *curobj;        // Current object pointer
  209. pols *pollist;        // List of polygons [polygon z, polygon point list]
  210. pols *curpol;        // Current polygon pointer
  211. scrpt *ptslist;    // List of polygon point data [nsides, col, nsides*{x,y}]
  212. scrpt *curpts;        // Current point pointer(!)
  213. rotpt *rotlist;    // List of rotated pts for object
  214. CGL_VERTEX2D_ST *curpts3DB;    // For 3D Blaster sprites
  215. CGL_TEXTURE2D_ST *curtex3DB;    //         --"--
  216.  
  217. int clip_tex;        // Current clip texture map
  218.  
  219. plyrdat *ppt;
  220.  
  221. int timeit=0;
  222.  
  223. BYTE *dumplbm;
  224. char dumpstr[]="dumpa.tga";
  225.  
  226. #ifdef COUNT
  227. int numpols;         // Count for number of polygons drawn
  228. #endif
  229.  
  230.  
  231. floatpt mcap_ballx,mcap_bally,mcap_ballz;
  232.  
  233. /***************** INITIALISED STRUCTURES ***************/
  234.  
  235. // Unit matrix
  236. mat unit=
  237.     {
  238.     {1.,0.,0.,0.},
  239.     {0.,1.,0.,0.},
  240.     {0.,0.,1.,0.},
  241.     {0.,0.,0.,1.},
  242.     };
  243.  
  244.  
  245.  
  246. //////////////////
  247. // MEMORY AREAS //
  248.  
  249. // Texture map pages
  250. #define X_BM 6  // Bitmap offset for extra maps
  251. #define S_BM 8  // Bitmap offset for stand maps
  252. #ifdef NEW
  253. #define MAPPAGES (S_BM+8)
  254. #else
  255. #define MAPPAGES (S_BM+7)
  256. #endif
  257. #define MAPPAGES_4 (S_BM+2)
  258.  
  259. typedef BYTE mappage[256*256];
  260.  
  261. mappage *maps;
  262.  
  263. word mapsel[MAPPAGES+MAXLOOP+1];
  264.  
  265. BYTE *sky; // Sky map
  266.  
  267. BYTE pitch3DB[64*64]; // Pitch map (3D Blaster)
  268.  
  269.  
  270. /////////////////
  271. // SCREEN INFO //
  272.  
  273. // Space for main screen buffer
  274. BYTE *scrb;
  275.  
  276. // VESA mode list
  277. #define VESAMODES 2
  278. int modelist[VESAMODES+1]={0x100,0x101,-1};
  279.  
  280. // Screen buffer information (w%8=0,h%2=0)
  281. #define SCRSIZES 10
  282. buff_info MCGA_buff[SCRSIZES]=
  283.     {
  284.     {NULL, 320,200, 320,200, 0.5,   0.5,   dumpMCGA},
  285.     {NULL, 320,200, 296,184, 0.4625,0.46,  dumpMCGA},
  286.     {NULL, 320,200, 320,158, 0.5,   0.3975,dumpMCGA},
  287.     {NULL, 320,200, 264,166, 0.4125,0.4175,dumpMCGA},
  288.     {NULL, 320,200, 296,142, 0.4625,0.355, dumpMCGA},
  289.     {NULL, 320,200, 240,150, 0.375, 0.375, dumpMCGA},
  290.     {NULL, 320,200, 264,124, 0.4125,0.3125,dumpMCGA},
  291.     {NULL, 320,200, 216,132, 0.3375,0.3325,dumpMCGA},
  292.     {NULL, 320,200, 240,108, 0.375, 0.2725,dumpMCGA},
  293.     {NULL, 320,200, 216, 92, 0.3375,0.23,  dumpMCGA},
  294.     };
  295. buff_info VESA_buff[VESAMODES][SCRSIZES]=
  296.     {
  297.      {
  298.       {NULL, 640,400, 640,400, 1,     1,     dumpV256},
  299.       {NULL, 640,400, 584,366, 0.9125,0.9175,dumpV256},
  300.       {NULL, 640,400, 640,316, 1,     0.79,  dumpV256},
  301.       {NULL, 640,400, 528,332, 0.825, 0.8325,dumpV256},
  302.       {NULL, 640,400, 584,284, 0.9125,0.71,  dumpV256},
  303.       {NULL, 640,400, 480,300, 0.75,  0.75,  dumpV256},
  304.       {NULL, 640,400, 528,250, 0.825, 0.625, dumpV256},
  305.       {NULL, 640,400, 424,266, 0.6625,0.6675,dumpV256},
  306.       {NULL, 640,400, 480,216, 0.75,  0.54,  dumpV256},
  307.       {NULL, 640,400, 424,184, 0.6625,0.46,  dumpV256},
  308.      },
  309.      {
  310.       {NULL, 640,480, 640,480, 1,     1.2, dumpV256},
  311.       {NULL, 640,480, 584,440, 0.9125,1.1, dumpV256},
  312.       {NULL, 640,480, 640,380, 1,     0.95,dumpV256},
  313.       {NULL, 640,480, 528,400, 0.825, 1,   dumpV256},
  314.       {NULL, 640,480, 584,340, 0.9125,0.85,dumpV256},
  315.       {NULL, 640,480, 480,360, 0.75,  0.9, dumpV256},
  316.       {NULL, 640,480, 528,300, 0.825, 0.75,dumpV256},
  317.       {NULL, 640,480, 424,320, 0.6625,0.8, dumpV256},
  318.       {NULL, 640,480, 480,260, 0.75,  0.65,dumpV256},
  319.       {NULL, 640,480, 424,220, 0.6625,0.55,dumpV256},
  320.      },
  321.     };
  322.  
  323.  
  324. #define MODES_3DB 6
  325. #ifndef BLASTDEMO
  326. int modelist3DB[MODES_3DB+1]={0,3,5,-1};
  327. int modelist3DBh[MODES_3DB+1]={0,3,5,-1};
  328. #else
  329. int modelist3DB[MODES_3DB+1]={3,4,5,3,4,5,-1};
  330. //int modelist3DB[MODES_3DB+1]={0,1,2,3,4,5,-1};
  331. int modelist3DBh[MODES_3DB+1]={3,4,5,3,4,5,-1};
  332. //int modelist3DBh[MODES_3DB+1]={3,4,5,0,1,2,-1};
  333. #endif
  334. buff_info buff_3DB[MODES_3DB]=
  335.     {
  336.       {NULL, 320,200, 320,200, 0.5,  0.5,   dump3DB},
  337.       {NULL, 320,240, 320,240, 0.5,  0.6,   dump3DB},
  338.      {NULL, 640,350, 640,350, 1,    0.875, dump3DB},
  339.        {NULL, 640,400, 640,400, 1,    1,     dump3DB},
  340.      {NULL, 640,480, 640,480, 1,    1.2,   dump3DB},
  341.      {NULL, 800,600, 800,600, 1.25, 1.5,   dump3DB},
  342.     };
  343.  
  344. buff_info vidi_buff_1={NULL, 256,256, 128,80, 0.175,0.183, dumpnull};
  345. buff_info vidi_buff_2={NULL, 256,256, 128,80, 0.175,0.183, dumpvidi1};
  346.  
  347. // Palette
  348. BYTE pal[768];
  349.  
  350. // Polygon filters
  351. #define FILTERS 2
  352.  
  353. filter *filters;
  354.  
  355.  
  356.  
  357. //////////////////////
  358. // TEXTURE MAP INFO //
  359.  
  360.  
  361. // Team players:
  362. // Texture 13 (1+12): Head A (End 61 (1+5*12))
  363. // Texture 73 (61+12): Head B (End 121 (61+5*12))
  364. // Texture 133 (121+12): Torso A (End 181 (121+5*12))
  365. // Texture 193 (181+12): Torso B (End 241 (181+5*12))
  366. // Texture 244 (241+3): Lower Leg A (End 248 (241+7))
  367. // Texture 251 (248+3): Upper Arm A (End 255 (248+7))
  368. // Texture 258 (255+3): Upper Leg A (End 262 (255+7))
  369. // Texture 265 (262+3): Lower Arm A (End 269 (262+7))
  370. // Texture 272 (269+3): Lower Leg B (End 276 (269+7))
  371. // Texture 279 (276+3): Upper Arm B (End 283 (276+7))
  372. // Texture 286 (283+3): Upper Leg B (End 290 (283+7))
  373. // Texture 293 (290+3): Lower Arm B (End 297 (290+7))
  374. // Texture 309 (297+12): Foot (End 357 (297+5*12))
  375.  
  376.  
  377. // Referee & keeper:
  378. // Texture 369 (357+12): Torso Referee (End 417 (357+5*12))
  379. // Texture 429 (417+12): Torso Keeper (End 477 (417+5*12))
  380. // Texture 480 (477+3): Lower Leg Referee (End 484 (477+7))
  381. // Texture 487 (484+3): Upper Arm Referee (End 491 (484+7))
  382. // Texture 494 (491+3): Upper Leg Referee (End 498 (491+7))
  383. // Texture 501 (498+3): Lower Arm Referee (End 505 (498+7))
  384. // Texture 508 (505+3): Lower Leg Keeper (End 512 (505+7))
  385. // Texture 515 (512+3): Upper Arm Keeper (End 519 (512+7))
  386. // Texture 522 (519+3): Upper Leg Keeper (End 526 (519+7))
  387. // Texture 529 (526+3): Lower Arm Keeper (End 533 (526+7))
  388.  
  389. #define X_TM 533        // Offset for extra maps
  390. #define X_TM_NO (52+419)    // No of extra maps 
  391. #define N_TM (X_TM+52)        // Alternate torsos
  392. #define NT_TM (N_TM+412)    // Netting
  393.  
  394. #define S_TM X_TM+X_TM_NO    // Offset for stand maps
  395. #define S_TM_MAX 500            // Maximum no of stadium maps
  396.  
  397. #define NOTEXTURES S_TM+S_TM_MAX
  398.  
  399.  
  400. #define CLIP_TEXTURES 200
  401.  
  402. texture *textures;
  403.  
  404. // Misc looping textures
  405. int noloop=6;
  406. struct {
  407.     int pos;
  408.     texture tex;
  409.     } texloop[]=
  410.     {
  411.      {
  412.       0x1c040,
  413.       {0x000000,0x000000,0x3fff00,0x3fff00,
  414.        0x000000,0x3fff00,0x3fff00,0x000000}
  415.      },
  416.      {
  417.       0x1c040,
  418.       {0x000000,0x000000,0x1fff00,0x1fff00,
  419.        0x000000,0x3fff00,0x3fff00,0x000000}
  420.      },
  421.      {
  422.       0x1c040,
  423.       {0x000000,0x000000,0x7fff00,0x7fff00,
  424.        0x000000,0x7fff00,0x7fff00,0x000000}
  425.      },
  426.      {
  427.       0x1c080,
  428.       {0x000000,0x000000,0x3fff00,0x3fff00,
  429.        0x000000,0x7fff00,0x7fff00,0x000000}
  430.      },
  431.      {
  432.       0x1c040,
  433.       {0x000000,0x000000,0xbfff00,0xbfff00,
  434.        0x000000,0xbfff00,0xbfff00,0x000000}
  435.      },
  436.      {
  437.       0x1c0c0,
  438.       {0x000000,0x000000,0x5fff00,0x5fff00,
  439.        0x000000,0xbfff00,0xbfff00,0x000000}
  440.      },
  441.     };
  442.  
  443.  
  444. char *lang[6][29]=
  445. {
  446.     {
  447.     "GOAL SCORED BY: ",
  448.     "BOOKED, YELLOW CARD: ",
  449.     "RED CARD, SENT OFF: ",
  450.     "DIRECT FREE KICK",
  451.     "INDIRECT FREE KICK",
  452.     "PENALTY KICK",
  453.     "CORNER KICK",
  454.     "THROW IN",
  455.     "GOAL KICK",
  456.     "KICK OFF",
  457.     "OFFSIDE",
  458.     "PLAYER INJURED: ",
  459.     "FULL TIME",
  460.     "EXTRA TIME",
  461.     "HALF TIME",
  462.     "PENALTY SHOOTOUT",
  463.     "FINAL SCORE AFTER PENALTIES",
  464.     "OWN GOAL BY: ",
  465.     "REPLAY",
  466.     "SUBSTITUTION",
  467.     "FORMATION",
  468.     "CANCEL",
  469.     "SELECT",
  470.     "OFF",
  471.     "SUBSTITUTE",
  472.     "ON",
  473.     "DONE",
  474.     "OPTIONS",
  475.     "REFEREE : ",
  476.     },
  477.     {
  478.     "BUT DE: ",
  479.     "AVERT., C. JAUNE: ",
  480.     "C. ROUGE, RENV.: ",
  481.     "COUP FR. DIRECT",
  482.     "COUP FR. INDIR",
  483.     "PENALTY",
  484.     "CORNER",
  485.     "TOUCHE",
  486.     "TIR AU BUT",
  487.     "CP. D<ENVOI",
  488.     "HORS JEU",
  489.     "JOUEUR BLESSE: ",
  490.     "TPS TOTAL",
  491.     "PROLONG.",
  492.     "MI=TEMPS",
  493.     "PENALTIES",
  494.     "SCORE FINAL APRES PEN.",
  495.     "BUT CTRE SOM CAMP DE: ",
  496.     "REPLAY",
  497.     "REMPLACEMENT",
  498.     "FORMATION",
  499.     "ANNULER",
  500.     "SELECT",
  501.     "OFF",
  502.     "REMPLACANT",
  503.     "ON",
  504.     "FAIT",
  505.     "OPTIONS",
  506.     "ARBITRE : ",
  507.     },
  508.     {
  509.     "TORSCHUETZE: ",
  510.     "GELBE KARTE: ",
  511.     "ROTE KARTE: ",
  512.     "DIREKTER FREISTOSS",
  513.     "FREISTOSS",
  514.     "ELFMETER",
  515.     "ECKBALL",
  516.     "EINWURF",
  517.     "ABSTOSS",
  518.     "ANSTOSS",
  519.     "ABSEITS",
  520.     "SPIELER VERLETZT: ",
  521.     "ABPFIFF",
  522.     "VERLAENGERUNG",
  523.     "HALBZEIT",
  524.     "ELFMETERSCHIESSEN",
  525.     "ERGEBNIS NACH ELFMETERSCHIESSEN",
  526.     "EIGENTOR VON ",
  527.     "WIEDERHOLUNG",
  528.     "AUSWECHSLUNG",
  529.     "AUFSTELLUNG",
  530.     "ABBRUCH",
  531.     "AUSWAEHLEN",
  532.     "RAUS",
  533.     "AUSWECHSELN",
  534.     "REIN",
  535.     "FERTIG",
  536.     "OPTIONEN",
  537.     "SCHIEDSRICHTER : ",
  538.     },
  539.     {
  540.     "GOAL SCORED BY: ",
  541.     "BOOKED, YELLOW CARD: ",
  542.     "RED CARD, SENT OFF: ",
  543.     "DIRECT FREE KICK",
  544.     "INDIRECT FREE KICK",
  545.     "PENALTY KICK",
  546.     "CORNER KICK",
  547.     "THROW IN",
  548.     "GOAL KICK",
  549.     "KICK OFF",
  550.     "OFFSIDE",
  551.     "PLAYER INJURED: ",
  552.     "FULL TIME",
  553.     "EXTRA TIME",
  554.     "HALF TIME",
  555.     "PENALTY SHOOTOUT",
  556.     "FINAL SCORE AFTER PENALTIES",
  557.     "OWN GOAL BY: ",
  558.     "REPLAY",
  559.     "SUBSTITUTION",
  560.     "FORMATION",
  561.     "CANCEL",
  562.     "SELECT",
  563.     "OFF",
  564.     "SUBSTITUTE",
  565.     "ON",
  566.     "DONE",
  567.     "OPTIONS",
  568.     "REFEREE : ",
  569.     },
  570.     {
  571.     "BUT DE: ",
  572.     "AVERT., C. JAUNE: ",
  573.     "C. ROUGE, RENV.: ",
  574.     "COUP FR. DIRECT",
  575.     "COUP FR. INDIR",
  576.     "PENALTY",
  577.     "CORNER",
  578.     "TOUCHE",
  579.     "TIR AU BUT",
  580.     "CP. D<ENVOI",
  581.     "HORS JEU",
  582.     "JOUEUR BLESSE: ",
  583.     "TPS TOTAL",
  584.     "PROLONG.",
  585.     "MI=TEMPS",
  586.     "PENALTIES",
  587.     "SCORE FINAL APRES PEN.",
  588.     "BUT CTRE SOM CAMP DE: ",
  589.     "REPLAY",
  590.     "REMPLACEMENT",
  591.     "FORMATION",
  592.     "ANNULER",
  593.     "SELECT",
  594.     "OFF",
  595.     "REMPLACANT",
  596.     "ON",
  597.     "FAIT",
  598.     "OPTIONS",
  599.     "ARBITRE : ",
  600.     },
  601.     {
  602.     "M>L SCORET AV: ",
  603.     "GULT KORT: ",
  604.     "R&DT KORT, SENDT UT: ",
  605.     "DIREKTE FRISPARK",
  606.     "INDIREKTE FRISPARK",
  607.     "STRAFFESPARK",
  608.     "CORNER",
  609.     "INNKAST",
  610.     "UTSPILL FRA M>L",
  611.     "AVSPARK",
  612.     "OFFSIDE",
  613.     "SKADD SPILLER: ",
  614.     "FULL TID",
  615.     "OVERTID",
  616.     "HALVTID",
  617.     "STRAFFEKONKURRANSE",
  618.     "SLUTTRESULTAT ETTER STRAFFER",
  619.     "SELVM>L VED: ",
  620.     "REPRISE",
  621.     "INNBYTTE",
  622.     "FORMASJON",
  623.     "AVBRYT",
  624.     "VELG",
  625.     "AV",
  626.     "INNBYTTER",
  627.     "P>",
  628.     "FERDIG",
  629.     "VALG",
  630.     "DOMMER : ",
  631.     },
  632. };
  633.  
  634.  
  635. // Stadia objects
  636. #define MAX_STAD_PTS 400
  637. #define MAX_STAD_FACES 400
  638. obj stad1,stad2,stad3,stad4;
  639. datapt stad1_p[MAX_STAD_PTS*3],stad2_p[MAX_STAD_PTS*3],stad3_p[MAX_STAD_PTS*3],stad4_p[MAX_STAD_PTS*3];
  640. word stad1_f[MAX_STAD_FACES*6],stad2_f[MAX_STAD_FACES*6],stad3_f[MAX_STAD_FACES*6],stad4_f[MAX_STAD_FACES*6];
  641. float st_w,st_l,st_h;
  642.  
  643.  
  644. /********************* FUNCTION CODE ********************/
  645.  
  646. /*******************/
  647. /* MATRIX ROUTINES */
  648.  
  649.  
  650. void matcop(mat dest,mat src)
  651. // Matrix copy
  652.     {
  653.     short i;
  654.     floatpt *p0,*p1;
  655.     p0=&dest[0][0];
  656.     p1=&src[0][0];
  657.     for (i=0;i<16;i++)
  658.             *p0++=*p1++;
  659.  
  660.     }
  661.  
  662. void matmul(mat m1,mat m2)
  663. // Matrix multiply
  664.     {
  665.     short i,j;
  666.  
  667.     mat res;
  668.     floatpt *wr=&res[0][0];
  669.  
  670.     for (i=0;i<4;i++)
  671.         for (j=0;j<4;j++)
  672.             *wr++=m1[0][j]*m2[i][0]+
  673.                   m1[1][j]*m2[i][1]+
  674.                   m1[2][j]*m2[i][2]+
  675.                   m1[3][j]*m2[i][3];
  676.  
  677.     matcop(m1,res);
  678.     }
  679.  
  680. void matmultr(mat m1,mat m2)
  681. // Reversed matrix multiply.
  682.     {
  683.     short i,j;
  684.  
  685.     mat res;
  686.     floatpt *wr=&res[0][0];
  687.  
  688.     for (i=0;i<4;i++)
  689.         for (j=0;j<4;j++)
  690.             *wr++=m1[0][j]*m2[0][i]+
  691.                   m1[1][j]*m2[1][i]+
  692.                   m1[2][j]*m2[2][i]+
  693.                   m1[3][j]*m2[3][i];
  694.  
  695.     matcop(m1,res);
  696.     }
  697.  
  698.  
  699.  
  700. /*********************************************/
  701. /* DRAW GROUND (SPECIALIZED TEXTURE MAPPING) */
  702.  
  703. //dword grtexx[]={0x00000000,0x003fffff,0x003fffff,0x00000000};
  704. //dword grtexy[]={0x00000000,0x00000000,0x003fffff,0x003fffff};
  705. dword grtexx[]={0x00000000,0x07ffffff,0x07ffffff,0x00000000};
  706. dword grtexy[]={0x00000000,0x00000000,0x057fffff,0x057fffff};
  707.  
  708. void ground(float vr,float vwy,datapt vx,datapt vy,datapt vz)
  709.     {
  710.     scrpt y,ys[4],ye,yd;
  711.     rotpt rx[4],ry[4],rz[4],ze;
  712.     float t,d,z,tx,tz,dw1,dw2,sa,sw;
  713.  
  714.     BYTE *scr,*scrline,*cpyline;
  715.     word w,flrsel,psh,pan;
  716.  
  717.     static dword td[5]={0,0,0,0,0};
  718.  
  719.     // Find highest pt of pitch
  720.     ry[0]=-st_l*rot.e.r10+st_w*rot.e.r12+rot.e.r13;
  721.     rz[0]=-st_l*rot.e.r20+st_w*rot.e.r22+rot.e.r23;
  722.     ry[1]=(1280+st_l)*rot.e.r10+st_w*rot.e.r12+rot.e.r13;
  723.     rz[1]=(1280+st_l)*rot.e.r20+st_w*rot.e.r22+rot.e.r23;
  724.     ry[2]=(1280+st_l)*rot.e.r10-(800+st_w)*rot.e.r12+rot.e.r13;
  725.     rz[2]=(1280+st_l)*rot.e.r20-(800+st_w)*rot.e.r22+rot.e.r23;
  726.     ry[3]=-st_l*rot.e.r10-(800+st_w)*rot.e.r12+rot.e.r13;
  727.     rz[3]=-st_l*rot.e.r20-(800+st_w)*rot.e.r22+rot.e.r23;
  728.  
  729.     if (scrmode3DB>=0)
  730.         {
  731.         rx[0]=-st_l*rot.e.r00+st_w*rot.e.r02+rot.e.r03;
  732.         rx[1]=(1280+st_l)*rot.e.r00+st_w*rot.e.r02+rot.e.r03;
  733.         rx[2]=(1280+st_l)*rot.e.r00-(800+st_w)*rot.e.r02+rot.e.r03;
  734.         rx[3]=-st_l*rot.e.r00-(800+st_w)*rot.e.r02+rot.e.r03;
  735.  
  736.         CGL_VERTEX2D_ST *pts3d;
  737.         CGL_TEXTURE3D_ST *tex3d;
  738.         word np,p,pt,pl;
  739.         short i,j,k;
  740.         float fc,fc2;
  741.         float tpts1[24];
  742.         float tpts2[24];
  743.         float ttex1[24];
  744.         float ttex2[24];
  745.         dword *polytexx,*polytexy;
  746.  
  747.         np=4;
  748.         pt=0;
  749.         for (j=0;j<np;j++)
  750.             {
  751.             k=j+1;
  752.             if (k==np) k=0;
  753.             if (rz[j]>=SCREENDIST)
  754.                 if (rz[k]>=SCREENDIST)
  755.                     {
  756.                     tpts2[pt]=rx[k];
  757.                     ttex2[pt++]=grtexx[k];
  758.                     tpts2[pt]=ry[k];
  759.                     ttex2[pt++]=grtexy[k];
  760.                     tpts2[pt++]=rz[k];
  761.                     }
  762.                 else
  763.                     {
  764.                     fc=(float)(rz[j]-SCREENDIST)/(rz[j]-rz[k]);
  765.                     tpts2[pt]=rx[j]+(fc*(rx[k]-rx[j]));
  766.                     ttex2[pt++]=grtexx[j]+(fc*(grtexx[k]-grtexx[j]));
  767.                     tpts2[pt]=ry[j]+(fc*(ry[k]-ry[j]));
  768.                     ttex2[pt++]=grtexy[j]+(fc*(grtexy[k]-grtexy[j]));
  769.                     tpts2[pt++]=SCREENDIST;
  770.                     }
  771.             else
  772.                 if (rz[k]>=SCREENDIST)
  773.                     {
  774.                     fc=(float)(rz[k]-SCREENDIST)/(rz[k]-rz[j]);
  775.                     tpts2[pt]=rx[k]+(fc*(rx[j]-rx[k]));
  776.                     ttex2[pt++]=grtexx[k]+(fc*(grtexx[j]-grtexx[k]));
  777.                     tpts2[pt]=ry[k]+(fc*(ry[j]-ry[k]));
  778.                     ttex2[pt++]=grtexy[k]+(fc*(grtexy[j]-grtexy[k]));
  779.                     tpts2[pt++]=SCREENDIST;
  780.                     tpts2[pt]=rx[k];
  781.                     ttex2[pt++]=grtexx[k];
  782.                     tpts2[pt]=ry[k];
  783.                     ttex2[pt++]=grtexy[k];
  784.                     tpts2[pt++]=rz[k];
  785.                     }
  786.             }
  787.  
  788.  
  789.         for (j=0;j<pt;j+=3)
  790.             {
  791.             tpts2[j]=q*tpts2[j]/tpts2[j+2]+render_buff.clip_xmid;
  792.             tpts2[j+1]=q*tpts2[j+1]/tpts2[j+2]+render_buff.clip_ymid;
  793.             }
  794.  
  795.         SetPerspTextureQuadOutput3DB(texaddr3DB[0]);
  796.         pts3d=&Vertex[0];
  797.         tex3d=(CGL_TEXTURE3D_ST *)&Texture[0];
  798.  
  799.         p=0;
  800.         for (j=0;j<pt;j+=3)
  801.             {
  802.             k=j+3;
  803.             if (k==pt) k=0;
  804.             if (tpts2[j]>=0)
  805.                 if (tpts2[k]>=0)
  806.                     {
  807.                     tpts1[p]=tpts2[k];
  808.                     ttex1[p++]=ttex2[k];
  809.                     tpts1[p]=tpts2[k+1];
  810.                     ttex1[p++]=ttex2[k+1];
  811.                     tpts1[p++]=tpts2[k+2];
  812.                     }
  813.                 else
  814.                     {
  815.                     fc=(float)tpts2[j]/(tpts2[j]-tpts2[k]);
  816.                     fc2=(float)tpts2[j+2]/(tpts2[k+2]*(float)-tpts2[k]/tpts2[j]+tpts2[j+2]);
  817.                     tpts1[p]=0;
  818.                     ttex1[p++]=ttex2[j]+(fc2*(ttex2[k]-ttex2[j]));
  819.                     tpts1[p]=tpts2[j+1]+(fc*(tpts2[k+1]-tpts2[j+1]));
  820.                     ttex1[p++]=ttex2[j+1]+(fc2*(ttex2[k+1]-ttex2[j+1]));
  821.                     tpts1[p++]=tpts2[j+2]+(fc2*(tpts2[k+2]-tpts2[j+2]));
  822.                     }
  823.             else
  824.                 if (tpts2[k]>=0)
  825.                     {
  826.                     fc=(float)tpts2[k]/(tpts2[k]-tpts2[j]);
  827.                     fc2=(float)tpts2[k+2]/(tpts2[j+2]*(float)-tpts2[j]/tpts2[k]+tpts2[k+2]);
  828.                     tpts1[p]=0;
  829.                     ttex1[p++]=ttex2[k]+(fc2*(ttex2[j]-ttex2[k]));
  830.                     tpts1[p]=tpts2[k+1]+(fc*(tpts2[j+1]-tpts2[k+1]));
  831.                     ttex1[p++]=ttex2[k+1]+(fc2*(ttex2[j+1]-ttex2[k+1]));
  832.                     tpts1[p++]=tpts2[k+2]+(fc2*(tpts2[j+2]-tpts2[k+2]));
  833.                     tpts1[p]=tpts2[k];
  834.                     ttex1[p++]=ttex2[k];
  835.                     tpts1[p]=tpts2[k+1];
  836.                     ttex1[p++]=ttex2[k+1];
  837.                     tpts1[p++]=tpts2[k+2];
  838.                     }
  839.             }
  840.  
  841.         pt=0;
  842.         for (j=0;j<p;j+=3)
  843.             {
  844.             k=j+3;
  845.             if (k==p) k=0;
  846.             if (tpts1[j]<=render_buff.clip_wid)
  847.                 if (tpts1[k]<=render_buff.clip_wid)
  848.                     {
  849.                     tpts2[pt]=tpts1[k];
  850.                     ttex2[pt++]=ttex1[k];
  851.                     tpts2[pt]=tpts1[k+1];
  852.                     ttex2[pt++]=ttex1[k+1];
  853.                     tpts2[pt++]=tpts1[k+2];
  854.                     }
  855.                 else
  856.                     {
  857.                     fc=(float)(render_buff.clip_wid-tpts1[j])/(tpts1[k]-tpts1[j]);
  858.                     fc2=(float)tpts1[j+2]/(tpts1[k+2]*(float)(tpts1[k]-render_buff.clip_wid)/(render_buff.clip_wid-tpts1[j])+tpts1[j+2]);
  859.                     tpts2[pt]=render_buff.clip_wid;
  860.                     ttex2[pt++]=ttex1[j]+(fc2*(ttex1[k]-ttex1[j]));
  861.                     tpts2[pt]=tpts1[j+1]+(fc*(tpts1[k+1]-tpts1[j+1]));
  862.                     ttex2[pt++]=ttex1[j+1]+(fc2*(ttex1[k+1]-ttex1[j+1]));
  863.                     tpts2[pt++]=tpts1[j+2]+(fc2*(tpts1[k+2]-tpts1[j+2]));
  864.                     }
  865.             else
  866.                 if (tpts1[k]<=render_buff.clip_wid)
  867.                     {
  868.                     fc=(float)(render_buff.clip_wid-tpts1[k])/(tpts1[j]-tpts1[k]);
  869.                     fc2=(float)tpts1[k+2]/(tpts1[j+2]*(float)(tpts1[j]-render_buff.clip_wid)/(render_buff.clip_wid-tpts1[k])+tpts1[k+2]);
  870.                     tpts2[pt]=render_buff.clip_wid;
  871.                     ttex2[pt++]=ttex1[k]+(fc2*(ttex1[j]-ttex1[k]));
  872.                     tpts2[pt]=tpts1[k+1]+(fc*(tpts1[j+1]-tpts1[k+1]));
  873.                     ttex2[pt++]=ttex1[k+1]+(fc2*(ttex1[j+1]-ttex1[k+1]));
  874.                     tpts2[pt++]=tpts1[k+2]+(fc2*(tpts1[j+2]-tpts1[k+2]));
  875.                     tpts2[pt]=tpts1[k];
  876.                     ttex2[pt++]=ttex1[k];
  877.                     tpts2[pt]=tpts1[k+1];
  878.                     ttex2[pt++]=ttex1[k+1];
  879.                     tpts2[pt++]=tpts1[k+2];
  880.                     }
  881.             }
  882.  
  883.         p=0;
  884.         for (j=0;j<pt;j+=3)
  885.             {
  886.             k=j+3;
  887.             if (k==pt) k=0;
  888.             if (tpts2[j+1]>=0)
  889.                 if (tpts2[k+1]>=0)
  890.                     {
  891.                     tpts1[p]=tpts2[k];
  892.                     ttex1[p++]=ttex2[k];
  893.                     tpts1[p]=tpts2[k+1];
  894.                     ttex1[p++]=ttex2[k+1];
  895.                     tpts1[p++]=tpts2[k+2];
  896.                     }
  897.                 else
  898.                     {
  899.                     fc=(float)tpts2[j+1]/(tpts2[j+1]-tpts2[k+1]);
  900.                     fc2=(float)tpts2[j+2]/(tpts2[k+2]*(float)-tpts2[k+1]/tpts2[j+1]+tpts2[j+2]);
  901.                     tpts1[p]=tpts2[j]+(fc*(tpts2[k]-tpts2[j]));
  902.                     ttex1[p++]=ttex2[j]+(fc2*(ttex2[k]-ttex2[j]));
  903.                     tpts1[p]=0;
  904.                     ttex1[p++]=ttex2[j+1]+(fc2*(ttex2[k+1]-ttex2[j+1]));
  905.                     tpts1[p++]=tpts2[j+2]+(fc2*(tpts2[k+2]-tpts2[j+2]));
  906.                     }
  907.             else
  908.                 if (tpts2[k+1]>=0)
  909.                     {
  910.                     fc=(float)tpts2[k+1]/(tpts2[k+1]-tpts2[j+1]);
  911.                     fc2=(float)tpts2[k+2]/(tpts2[j+2]*(float)-tpts2[j+1]/tpts2[k+1]+tpts2[k+2]);
  912.                     tpts1[p]=tpts2[k]+(fc*(tpts2[j]-tpts2[k]));
  913.                     ttex1[p++]=ttex2[k]+(fc2*(ttex2[j]-ttex2[k]));
  914.                     tpts1[p]=0;
  915.                     ttex1[p++]=ttex2[k+1]+(fc2*(ttex2[j+1]-ttex2[k+1]));
  916.                     tpts1[p++]=tpts2[k+2]+(fc2*(tpts2[j+2]-tpts2[k+2]));
  917.                     tpts1[p]=tpts2[k];
  918.                     ttex1[p++]=ttex2[k];
  919.                     tpts1[p]=tpts2[k+1];
  920.                     ttex1[p++]=ttex2[k+1];
  921.                     tpts1[p++]=tpts2[k+2];
  922.                     }
  923.             }
  924.  
  925.         pt=0;
  926.         for (j=0;j<p;j+=3)
  927.             {
  928.             k=j+3;
  929.             if (k==p) k=0;
  930.             if (tpts1[j+1]<=render_buff.clip_hgtl)
  931.                 if (tpts1[k+1]<=render_buff.clip_hgtl)
  932.                     {
  933.                     pts3d[pt].x=(int)tpts1[k]<<16;
  934.                     tex3d[pt].s=ttex1[k];
  935.                     pts3d[pt].y=(int)tpts1[k+1]<<16;
  936.                     tex3d[pt].t=ttex1[k+1];
  937.                     tex3d[pt++].q=tpts1[k+2];
  938.                     }
  939.                 else
  940.                     {
  941.                     fc=(float)(render_buff.clip_hgtl-tpts1[j+1])/(tpts1[k+1]-tpts1[j+1]);
  942.                     fc2=(float)tpts1[j+2]/(tpts1[k+2]*(float)(tpts1[k+1]-render_buff.clip_hgt)/(render_buff.clip_hgt-tpts1[j+1])+tpts1[j+2]);
  943.                     pts3d[pt].x=(int)(tpts1[j]+(fc*(tpts1[k]-tpts1[j])))<<16;
  944.                     tex3d[pt].s=ttex1[j]+(int)(fc2*(ttex1[k]-ttex1[j]));
  945.                     pts3d[pt].y=render_buff.clip_hgtl<<16;
  946.                     tex3d[pt].t=ttex1[j+1]+(int)(fc2*(ttex1[k+1]-ttex1[j+1]));
  947.                     tex3d[pt++].q=tpts1[j+2]+(int)(fc2*(tpts1[k+2]-tpts1[j+2]));
  948.                     }
  949.             else
  950.                 if (tpts1[k+1]<=render_buff.clip_hgtl)
  951.                     {
  952.                     fc=(float)(render_buff.clip_hgtl-tpts1[k+1])/(tpts1[j+1]-tpts1[k+1]);
  953.                     fc2=tpts1[k+2]/(tpts1[j+2]*(float)(tpts1[j+1]-render_buff.clip_hgt)/(render_buff.clip_hgt-tpts1[k+1])+tpts1[k+2]);
  954.                     pts3d[pt].x=(int)(tpts1[k]+(fc*(tpts1[j]-tpts1[k])))<<16;
  955.                     tex3d[pt].s=ttex1[k]+(int)(fc2*(ttex1[j]-ttex1[k]));
  956.                     pts3d[pt].y=render_buff.clip_hgtl<<16;
  957.                     tex3d[pt].t=ttex1[k+1]+(int)(fc2*(ttex1[j+1]-ttex1[k+1]));
  958.                     tex3d[pt++].q=tpts1[k+2]+(int)(fc2*(tpts1[j+2]-tpts1[k+2]));
  959.                     pts3d[pt].x=(int)tpts1[k]<<16;
  960.                     tex3d[pt].s=ttex1[k];
  961.                     pts3d[pt].y=(int)tpts1[k+1]<<16;
  962.                     tex3d[pt].t=ttex1[k+1];
  963.                     tex3d[pt++].q=tpts1[k+2];
  964.                     }
  965.             }
  966.  
  967.         p=0;
  968.         pl=pt;
  969.         while (pl>4)
  970.             {
  971.             p+=4;
  972.             pt+=2;
  973.             pl-=2;
  974.             for (j=pt-1;j>p;j--)
  975.                 {
  976.                 pts3d[j].x=pts3d[j-2].x;
  977.                 pts3d[j].y=pts3d[j-2].y;
  978.                 tex3d[j].s=tex3d[j-2].s;
  979.                 tex3d[j].t=tex3d[j-2].t;
  980.                 tex3d[j].q=tex3d[j-2].q;
  981.                 }
  982.             pts3d[p].x=pts3d[0].x;
  983.             pts3d[p].y=pts3d[0].y;
  984.             tex3d[p].s=tex3d[0].s;
  985.             tex3d[p].t=tex3d[0].t;
  986.             tex3d[p].q=tex3d[0].q;
  987.             }
  988.         p+=pl;
  989.         if (pl==3)
  990.             {
  991.             pts3d[p].x=pts3d[0].x;
  992.             pts3d[p].y=pts3d[0].y;
  993.             tex3d[p].s=tex3d[0].s;
  994.             tex3d[p].t=tex3d[0].t;
  995.             tex3d[p].q=tex3d[0].q;
  996.             p++;
  997.             }
  998.  
  999.         int mz;
  1000.         float tq;
  1001.         for (k=0;k<p;k+=4)
  1002.             {
  1003.             mz=tex3d[k].q;
  1004.             for (j=1;j<4;j++)
  1005.                 if (tex3d[k+j].q<mz) mz=tex3d[k+j].q;
  1006.             for (j=0;j<4;j++)
  1007.                 {
  1008.                 tq=(float)mz/tex3d[k+j].q;
  1009.                 tex3d[k+j].s*=tq;
  1010.                 tex3d[k+j].t*=tq;
  1011.                 tex3d[k+j].q=tq*65536;
  1012.                 }
  1013.             }
  1014.  
  1015.         pts3d+=p;
  1016.         tex3d+=p;
  1017.  
  1018.  
  1019.         if ((p=pts3d-Vertex)>0)
  1020.             {
  1021.             SetPerspTextureQuadOutput3DB(pitchaddr3DB);
  1022.             Render3DB(p);
  1023.             }
  1024.  
  1025.         // Find lowest pt of sky
  1026.         #define ST_DP 200
  1027.         ry[0]=-(st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11+(st_w+ST_DP)*rot.e.r12+rot.e.r13;
  1028.         rz[0]=-(st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21+(st_w+ST_DP)*rot.e.r22+rot.e.r23;
  1029.         ry[1]=(1280+st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11+(st_w+ST_DP)*rot.e.r12+rot.e.r13;
  1030.         rz[1]=(1280+st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21+(st_w+ST_DP)*rot.e.r22+rot.e.r23;
  1031.         ry[2]=(1280+st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11-(800+st_w+ST_DP)*rot.e.r12+rot.e.r13;
  1032.         rz[2]=(1280+st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21-(800+st_w+ST_DP)*rot.e.r22+rot.e.r23;
  1033.         ry[3]=-(st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11-(800+st_w+ST_DP)*rot.e.r12+rot.e.r13;
  1034.         rz[3]=-(st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21-(800+st_w+ST_DP)*rot.e.r22+rot.e.r23;
  1035.  
  1036.         if (rz[0]>0)
  1037.             ye=q*ry[0]/rz[0],ze=rz[0];
  1038.         else 
  1039.             ye=render_buff.clip_ymid,ze=0;
  1040.         if (rz[1]>ze) ye=q*ry[1]/rz[1],ze=rz[1];
  1041.         if (rz[2]>ze) ye=q*ry[2]/rz[2],ze=rz[2];
  1042.         if (rz[3]>ze) ye=q*ry[3]/rz[3],ze=rz[3];
  1043.         if (ye<=-render_buff.clip_ymid) ye=-render_buff.clip_ymid+1;
  1044.  
  1045.         if (ye<render_buff.clip_ymid)
  1046.             {
  1047.             SetRectangleOutput3DBx(skyaddr3DB);
  1048.             Vertex[0].x=render_buff.clip_widl<<16;
  1049.             Vertex[0].y=render_buff.clip_hgt<<16;
  1050.             Vertex[1].x=0;
  1051.             Vertex[1].y=(ye+render_buff.clip_ymid)<<16;
  1052.  
  1053.             sa=atan(512/(q*512/(640*((render_buff.scale_x+render_buff.scale_y)/2))));
  1054.             if (sth<0)
  1055.                 {
  1056.                 Texture[0].s=((int)(512*acos((double)cth)/sa)%512)<<16;
  1057.                 Texture[1].s=(511+((int)(512*acos((double)cth)/sa)%512))<<16;
  1058.                 }
  1059.             else
  1060.                 {
  1061.                 Texture[0].s=-((int)(512*acos((double)cth)/sa)%512)<<16;
  1062.                 Texture[1].s=(511-((int)(512*acos((double)cth)/sa)%512))<<16;
  1063.                 }
  1064.             Texture[0].t=((256*(ye+render_buff.clip_ymid))/render_buff.clip_hgt)<<16;
  1065.             Texture[1].t=255<<16;
  1066.             Render3DB(2);
  1067.             }
  1068.  
  1069.         return;
  1070.         }
  1071.  
  1072.     if (setup.detail.pitch)
  1073.         {    
  1074.         if (rz[0]>0)
  1075.             ye=q*ry[0]/rz[0],ze=rz[0];
  1076.         else 
  1077.             ye=-render_buff.clip_ymid,ze=0;
  1078.         if (rz[1]>ze) ye=q*ry[1]/rz[1],ze=rz[1];
  1079.         if (rz[2]>ze) ye=q*ry[2]/rz[2],ze=rz[2];
  1080.         if (rz[3]>ze) ye=q*ry[3]/rz[3],ze=rz[3];
  1081.         if (ye>render_buff.clip_ymid) ye=render_buff.clip_ymid;
  1082.  
  1083.         scrline=render_buff.clip_end+render_buff.clip_wid;
  1084.         y=-render_buff.clip_ymid;
  1085.         t=q*sph+y*cph;                        // Repeated divisor & incrementor
  1086.  
  1087.         while (t<0 && y<ye)
  1088.             {                 
  1089.             d=vy/t;                                // Depth (unscaled)
  1090.             z=d*(q*cph-y*sph);                // Floor depth
  1091.             tx=vx-z*sth;                        // X pos of pt
  1092.             tz=-vz-z*cth;                        // Z pos of pt
  1093.  
  1094.             dw2=-d*sth;
  1095.             dw1=d*cth;
  1096.             if (setup.detail.pitch==1)
  1097.                 {
  1098.                 psh=15;
  1099.                 pan=0x1f1f;
  1100.                 flrsel=mapsel[mappages+noloop];
  1101.                 }
  1102.             else
  1103.                 {
  1104.                 psh=16;
  1105.                 pan=0x3f3f;
  1106.                 flrsel=mapsel[mappages+noloop+1];
  1107.                 }
  1108.             td[1]=(dword)((tz-dw2*render_buff.clip_xmid)*(1<<psh));
  1109.             td[2]=(dword)((tx-dw1*render_buff.clip_xmid)*(1<<psh));
  1110.             td[3]=(dword)(dw2*(1<<psh))&0xffffff;
  1111.             td[4]=(dword)(dw1*(1<<psh))&0xffffff;
  1112.  
  1113.             y++;
  1114.             t+=cph;
  1115.  
  1116.             scr=scrline;
  1117.             w=render_buff.clip_wid;
  1118.             //Assembly burst for pitch scan line
  1119.             extern void hlinp1(void);
  1120.             #pragma aux hlinp1=\
  1121.                 ".486"\
  1122.                   "push    ebp"\
  1123.                 "push    ds"\
  1124.                 "mov    esi,td[2]"\
  1125.                 "mov    si,pan"\
  1126.                 "mov    edx,td[10]"\
  1127.                 "mov    bx,word ptr td[18]"\
  1128.                 "mov    ecx,td[14]"\
  1129.                 "mov    ch,bl"\
  1130.                 "and    cx,si"\
  1131.                 "mov    ebx,td[6]"\
  1132.                 "mov    bh,dl"\
  1133.                 "mov    dx,0"\
  1134.                 "mov    di,w"\
  1135.                 "mov    ax,flrsel"\
  1136.                 "mov    ds,ax"\
  1137.                 "mov    ebp,scr";
  1138.             extern void hlinp2(void);
  1139.             #pragma aux hlinp2=\
  1140.                 "lpp:"\
  1141.                 "and    bx,si"\
  1142.                 "mov    al,[bx]"\
  1143.                 "add     esi,edx"\
  1144.                 "adc    ebx,ecx"\
  1145.                 "adc    bh,dh"\
  1146.                 "and    bx,si"\
  1147.                 "mov    ah,[bx]"\
  1148.                 "add     esi,edx"\
  1149.                 "adc    ebx,ecx"\
  1150.                 "adc    bh,dh"\
  1151.                 "and    bx,si"\
  1152.                 "bswap eax"\
  1153.                 "mov    ah,[bx]"\
  1154.                 "add     esi,edx"\
  1155.                 "adc    ebx,ecx"\
  1156.                 "adc    bh,dh"\
  1157.                 "and    bx,si"\
  1158.                 "mov    al,[bx]"\
  1159.                 "add     esi,edx"\
  1160.                 "adc    ebx,ecx"\
  1161.                 "adc    bh,dh"\
  1162.                 "mov    -4[ebp],eax"\
  1163.                 "and    bx,si"\
  1164.                 "mov    al,[bx]"\
  1165.                 "add     esi,edx"\
  1166.                 "adc    ebx,ecx"\
  1167.                 "adc    bh,dh"\
  1168.                 "and    bx,si"\
  1169.                 "mov    ah,[bx]"\
  1170.                 "add     esi,edx"\
  1171.                 "adc    ebx,ecx"\
  1172.                 "adc    bh,dh"\
  1173.                 "and    bx,si"\
  1174.                 "bswap eax"\
  1175.                 "mov    ah,[bx]"\
  1176.                 "add     esi,edx"\
  1177.                 "adc    ebx,ecx"\
  1178.                 "adc    bh,dh"\
  1179.                 "and    bx,si"\
  1180.                 "mov    al,[bx]"\
  1181.                 "add     esi,edx"\
  1182.                 "adc    ebx,ecx"\
  1183.                 "adc    bh,dh"\
  1184.                 "sub    ebp,8"\
  1185.                 "mov    [ebp],eax"\
  1186.                 "sub    di,8"\
  1187.                 "jne    short lpp"\
  1188.                 "pop    ds"\
  1189.                 "pop    ebp"\
  1190.                 modify [eax ebx ecx edx esi edi];
  1191.             hlinp1();
  1192.             hlinp2();
  1193.  
  1194.             scrline-=render_buff.buff_wid;
  1195.             }
  1196.         }
  1197.  
  1198.  
  1199.     // Find lowest pt of sky
  1200.     #define ST_DP 200
  1201.     ry[0]=-(st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11+(st_w+ST_DP)*rot.e.r12+rot.e.r13;
  1202.     rz[0]=-(st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21+(st_w+ST_DP)*rot.e.r22+rot.e.r23;
  1203.     ry[1]=(1280+st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11+(st_w+ST_DP)*rot.e.r12+rot.e.r13;
  1204.     rz[1]=(1280+st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21+(st_w+ST_DP)*rot.e.r22+rot.e.r23;
  1205.     ry[2]=(1280+st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11-(800+st_w+ST_DP)*rot.e.r12+rot.e.r13;
  1206.     rz[2]=(1280+st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21-(800+st_w+ST_DP)*rot.e.r22+rot.e.r23;
  1207.     ry[3]=-(st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11-(800+st_w+ST_DP)*rot.e.r12+rot.e.r13;
  1208.     rz[3]=-(st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21-(800+st_w+ST_DP)*rot.e.r22+rot.e.r23;
  1209.  
  1210.     if (rz[0]>0)
  1211.         ye=q*ry[0]/rz[0],ze=rz[0];
  1212.     else 
  1213.         ye=render_buff.clip_ymid,ze=0;
  1214.     if (rz[1]>ze) ye=q*ry[1]/rz[1],ze=rz[1];
  1215.     if (rz[2]>ze) ye=q*ry[2]/rz[2],ze=rz[2];
  1216.     if (rz[3]>ze) ye=q*ry[3]/rz[3],ze=rz[3];
  1217.     if (ye<-render_buff.clip_ymid) ye=-render_buff.clip_ymid;
  1218.  
  1219.  
  1220.     #define PI 3.1415
  1221.     sa=atan((double)render_buff.clip_wid/q);
  1222.     sw=3;//(int)(0.5+2*PI/sa);
  1223.     sa=2*PI/sw;
  1224.  
  1225.     if (setup.M8&&setup.detail.sky)
  1226.         {
  1227.         if ((yd=ye+q*sph/cph)<0) yd=0;
  1228.         if (479-yd<240-ye) yd=240+ye;
  1229.         if (sth<0)
  1230.             cpyline=sky+640*(480-yd)-(int)(640*acos((double)cth)/sa)%640;
  1231.         else
  1232.             cpyline=sky+640*(479-yd)+(int)(640*acos((double)cth)/sa)%640;
  1233.         y=render_buff.clip_ymid-ye-1;
  1234.         scrline=render_buff.buff_start+y*render_buff.buff_wid;
  1235.         while (y-->=0)
  1236.             {
  1237.             memcpy(scrline,cpyline,render_buff.clip_wid);
  1238.             scrline-=render_buff.buff_wid;
  1239.             cpyline-=640;
  1240.             }
  1241.         }
  1242.     else
  1243.         {
  1244.     #if 0
  1245.         if ((yd=ye+q*sph/cph)<0) yd=0;
  1246.         if (199-yd<100-ye) yd=100+ye;
  1247.         if (sth<0)
  1248.             cpyline=sky+320*(200-yd)-(int)(render_buff.clip_wid*acos((double)cth)/sa)%320;
  1249.         else
  1250.             cpyline=sky+320*(199-yd)+(int)(render_buff.clip_wid*acos((double)cth)/sa)%320;
  1251.         y=render_buff.clip_ymid-ye-1;
  1252.         scrline=render_buff.buff_start+y*render_buff.buff_wid;
  1253.         while (y-->=0)
  1254.             {
  1255.             memcpy(scrline,cpyline,render_buff.clip_wid);
  1256.             cpyline-=320;
  1257.             scrline-=render_buff.buff_wid;
  1258.             }
  1259.     #else
  1260.         y=render_buff.clip_ymid-ye-1;
  1261.         scrline=render_buff.buff_start+y*render_buff.buff_wid;
  1262.         while (y-->=0)
  1263.             {
  1264.             memset(scrline,204,render_buff.clip_wid);
  1265.             scrline-=render_buff.buff_wid;
  1266.             }
  1267.     #endif
  1268.         }
  1269.     }
  1270.  
  1271.  
  1272.  
  1273. /******************************/
  1274. /* GET OBJECT DEPTH STRUCTURE */
  1275.  
  1276. // Macro for objects with no detail levels
  1277. #define objdep(ob) ((ob).x*rot.e.r20+(ob).y*rot.e.r21+(ob).z*rot.e.r22+rot.e.r23)
  1278.  
  1279. // Routine for objects with detail levels
  1280. float objdepd(obj *ob, det *detail)
  1281.     {
  1282.     rotpt oz,zq;
  1283.     if ((oz=ob->x*rot.e.r20+ob->y*rot.e.r21+ob->z*rot.e.r22+rot.e.r23)<0)
  1284.         zq=0;
  1285.     else
  1286.         zq=oz/q;
  1287.     while (detail->zscale>zq) detail++;
  1288.     ob->points=detail->dpoints;
  1289.     ob->faces=detail->dfaces;
  1290.     return oz;
  1291.     }
  1292.  
  1293.  
  1294.  
  1295. /*************************************/
  1296. /* ADD ROTATED FACES TO POLYGON LIST */
  1297.  
  1298. // Add ordinary polygon to list
  1299. void
  1300. addpoly(face obf,word np,word col)
  1301.     {
  1302.     word p;
  1303.     rotpt dx1,dy1,dx2,dy2,tz1,tz2;
  1304.     rpt tpt1,tpt2,tpt3;
  1305.  
  1306.     // Unroll first three face points in subsequent code
  1307.     tpt1=&rotlist[obf[0]<<2];
  1308.     tpt2=&rotlist[obf[1]<<2];
  1309.     tpt3=&rotlist[obf[2]<<2];
  1310.  
  1311.     // Find min z
  1312.     tz2=tpt1[0];
  1313.     if (tpt2[0]<tz2) tz2=tpt2[0];
  1314.     if (tpt3[0]<tz2) tz2=tpt3[0];
  1315.     for (p=3;p<np;p++)
  1316.         if ((tz1=rotlist[obf[p]<<2])<tz2) tz2=tz1;
  1317.  
  1318.     // If visible...
  1319.     if (tz2>=CUTOFFDIST)
  1320.         {
  1321.         // Facing check
  1322.         dx1=dx2=tpt1[1];
  1323.         dy1=dy2=tpt1[2];
  1324.         dx1-=tpt2[1];
  1325.         dy1-=tpt2[2];
  1326.         dx2-=tpt3[1];
  1327.         dy2-=tpt3[2];
  1328.  
  1329.         if (dx1*dy2<dx2*dy1)
  1330.             {
  1331.             // Transfer rotated points to polygon list
  1332.             // and calculate average z
  1333.             curpol->pts=curpts;
  1334.             curpts[0]=np;
  1335.             curpts[1]=col;
  1336.  
  1337. /*
  1338. if (col>=256)
  1339.     {
  1340.      tz1=tpt1[0];
  1341.     curpts[2]=max(tz1,CUTOFFDIST);
  1342.     curpts[3]=tpt1[1];
  1343.     curpts[4]=tpt1[2];
  1344.     tz1+=tpt2[0];
  1345.     curpts[5]=max(tpt2[0],CUTOFFDIST);
  1346.     curpts[6]=tpt2[1];
  1347.     curpts[7]=tpt2[2];
  1348.     tz1+=tpt3[0];
  1349.     curpts[8]=max(tpt3[0],CUTOFFDIST);
  1350.     curpts[9]=tpt3[1];
  1351.     curpts[10]=tpt3[2];
  1352.     curpts+=11;
  1353.     for (p=3;p<np;p++)
  1354.         {
  1355.         tpt1=&rotlist[obf[p]<<2];
  1356.         tz1+=tpt1[0];
  1357.         curpts[0]=max(tpt1[0],CUTOFFDIST);
  1358.           curpts[1]=tpt1[1];
  1359.         curpts[2]=tpt1[2];
  1360.         curpts+=3;
  1361.         }
  1362.     }
  1363. else
  1364.     {
  1365.     }
  1366. */
  1367.             tz1=tpt1[0];
  1368.             curpts[2]=tpt1[1];
  1369.             curpts[3]=tpt1[2];
  1370.             tz1+=tpt2[0];
  1371.             curpts[4]=tpt2[1];
  1372.             curpts[5]=tpt2[2];
  1373.             tz1+=tpt3[0];
  1374.             curpts[6]=tpt3[1];
  1375.             curpts[7]=tpt3[2];
  1376.             curpts+=8;
  1377.             for (p=3;p<np;p++)
  1378.                 {
  1379.                 tpt1=&rotlist[obf[p]<<2];
  1380.                 tz1+=tpt1[0];
  1381.                 curpts[0]=tpt1[1];
  1382.                 curpts[1]=tpt1[2];
  1383.                 curpts+=2;
  1384.                 }
  1385.             curpol->z=tz1/np;
  1386.             curpol++;
  1387.             }
  1388.         }
  1389.     }
  1390.  
  1391.     
  1392. // Add line to list
  1393. void
  1394. addline(face obf,word col)
  1395.     {
  1396.     rotpt tz;
  1397.     rpt tpt1,tpt2;
  1398.  
  1399.     // Find min z
  1400.     tpt1=&rotlist[obf[0]<<2];
  1401.     tpt2=&rotlist[obf[1]<<2];
  1402.     tz=min(tpt1[0],tpt2[0]); 
  1403.  
  1404.     // If visible...
  1405.     if (tz>=CUTOFFDIST)
  1406.         {
  1407.         // Transfer rotated line points to polygon
  1408.         // list and calculate average z
  1409.         curpol->pts=curpts;
  1410.         curpol->z=(tpt1[0]+tpt2[0])/2;
  1411.         curpts[0]=2;
  1412.         curpts[1]=col;
  1413.         curpts[2]=tpt1[1];
  1414.         curpts[3]=tpt1[2];
  1415.         curpts[4]=tpt2[1];
  1416.         curpts[5]=tpt2[2];
  1417.         curpts+=6;
  1418.           curpol++;                  
  1419.         }
  1420.     }
  1421.  
  1422.  
  1423. // Add 3d cylinder map to list
  1424. void
  1425. add3dcmap(face obf,word col)
  1426.     {
  1427.     rotpt dx1,dy1,dx2,dy2,tz1,tz2;
  1428.     rpt tpt1,tpt2,tpt3;
  1429.  
  1430.     // Find min z
  1431.     tpt1=&rotlist[obf[0]<<2];
  1432.     tpt2=&rotlist[obf[1]<<2];
  1433.     tz1=min(tpt1[0],tpt2[0]); 
  1434.  
  1435.     // If visible...
  1436.     if (tz1>=CUTOFFDIST)
  1437.         {
  1438.         curpts[0]=4;
  1439.         curpol->pts=curpts;
  1440.         curpol->z=(tpt1[0]+tpt2[0])/2;
  1441.  
  1442.         // Calculate bounding rectangle for cylinder texture map
  1443.  
  1444.         /*
  1445.         tpt1[0]=0;
  1446.         tpt1[1]=0;
  1447.         tpt1[2]=0;
  1448.         tpt2[0]=0;
  1449.         tpt2[1]=0;
  1450.         tpt2[2]=0;
  1451.         obf[2]=0;
  1452.         obf[3]=0;
  1453.         */
  1454.  
  1455.         dx1=tpt1[1]-tpt2[1];
  1456.         dy1=tpt1[2]-tpt2[2];
  1457.         if ((dx2=dx1*dx1+dy1*dy1)==0) dx1=dx2=1;
  1458.         tz2=obf[2]*qa/(sqrt(dx2)*(tpt1[0]+tpt2[0]));
  1459.         tz1=100*(tpt2[0]-tpt1[0])/obf[3];
  1460.         if (tz1>=0)
  1461.             {                   
  1462.             if (tz1>0.78062475)
  1463.                 if (tz1>0.92702481) col-=3;
  1464.                 else col-=2;
  1465.             else
  1466.                 if (tz1>0.48412292) col--;
  1467. //            if (tz1>0.78062475)
  1468. //                if (tz1>0.92702481) col-=3;
  1469. //                else col-=2;
  1470. //            else
  1471. //                if (tz1>0.48412292) col--;
  1472. //            col-=(int)((1-sqrt(1-tz1*tz1))*4.3);
  1473.             tz1*=tz2;
  1474.             dy2=tz2*dy1;
  1475.             dx2=tz2*dx1;
  1476.             dy1*=tz1;
  1477.             dx1*=tz1;
  1478.             curpts[1]=col;
  1479.             curpts[2]=tpt1[1]+dx1-dy2;
  1480.             curpts[3]=tpt1[2]+dy1+dx2;
  1481.             curpts[4]=tpt1[1]+dx1+dy2;
  1482.             curpts[5]=tpt1[2]+dy1-dx2;
  1483.             curpts[6]=tpt2[1]-dx1+dy2;
  1484.             curpts[7]=tpt2[2]-dy1-dx2;
  1485.             curpts[8]=tpt2[1]-dx1-dy2;
  1486.             curpts[9]=tpt2[2]-dy1+dx2;
  1487.             }
  1488.         else
  1489.             {
  1490.             if (tz1<-0.78062475)
  1491.                 if (tz1<-0.92702481) col+=3;
  1492.                 else col+=2;
  1493.             else
  1494.                 if (tz1<-0.48412292) col++;
  1495. //            col+=(int)((1-sqrt(1-tz1*tz1))*4.3);
  1496.             tz1*=tz2;
  1497.             dy2=tz2*dy1;
  1498.             dx2=tz2*dx1;
  1499.             dy1*=tz1;
  1500.             dx1*=tz1;
  1501.             curpts[1]=col;
  1502.             curpts[2]=tpt1[1]-dx1-dy2;
  1503.             curpts[3]=tpt1[2]-dy1+dx2;
  1504.             curpts[4]=tpt1[1]-dx1+dy2;
  1505.             curpts[5]=tpt1[2]-dy1-dx2;
  1506.             curpts[6]=tpt2[1]+dx1+dy2;
  1507.             curpts[7]=tpt2[2]+dy1-dx2;
  1508.             curpts[8]=tpt2[1]+dx1-dy2;
  1509.             curpts[9]=tpt2[2]+dy1+dx2;
  1510.             }
  1511.         curpts+=10;
  1512.           curpol++;                  
  1513.         }
  1514.     }
  1515.  
  1516.  
  1517. // Add 3d eliptical cylinder map to list
  1518. void
  1519. add3demap(face obf,word col)
  1520.     {
  1521.     rotpt dx1,dy1,dx2,dy2,tz1,tz2,rx,ry,rz;
  1522.     rpt tpt1,tpt2,tpt3;
  1523.  
  1524.     // Find min z
  1525.     tpt1=&rotlist[obf[0]<<2];
  1526.     tpt2=&rotlist[obf[1]<<2];
  1527.     tz1=min(tpt1[0],tpt2[0]); 
  1528.  
  1529.     // If visible...
  1530.     if (tz1>=CUTOFFDIST)
  1531.         {
  1532.         curpts[0]=4;
  1533.         curpol->pts=curpts;
  1534.         curpol->z=(tpt1[0]+tpt2[0])/2;
  1535.  
  1536.         // Calculate bounding rectangle for elliptical cylinder texture map
  1537. //        tpt3=&rotlist[obf[2]<<2];
  1538. //        dx1=tpt1[1]-tpt2[1];
  1539. //        dy1=tpt1[2]-tpt2[2];
  1540. //        rx=((tpt3[1]-render_buff.clip_xmid)*tpt3[0]-(tpt2[1]-render_buff.clip_xmid)*tpt2[0])/q;
  1541. //        ry=((tpt3[2]-render_buff.clip_ymid)*tpt3[0]-(tpt2[2]-render_buff.clip_ymid)*tpt2[0])/q;
  1542. //        if ((dx2=dx1*dx1+dy1*dy1)<2) return;
  1543. //        dx2=sqrt(dx2);
  1544. //        dy2=100*(tpt1[0]-tpt2[0])/obf[5];
  1545. //        tz1=(rx*dy1-ry*dx1)/dx2;
  1546. //        tz2=qa/(dx2*(tpt1[0]+tpt2[0]));
  1547.  
  1548.         tpt3=&rotlist[obf[2]<<2];
  1549.         dx1=tpt1[1]-tpt2[1];
  1550.         dy1=tpt1[2]-tpt2[2];
  1551.         rx=(tpt3[1]-tpt2[1])*tpt3[0]/q;
  1552.         ry=(tpt3[2]-tpt2[2])*tpt3[0]/q;
  1553.         if ((dx2=dx1*dx1+dy1*dy1)==0) dx1=dx2=1;
  1554.         dy2=sqrt(dx2);
  1555.         tz2=qa/(dy2*(tpt1[0]+tpt2[0]));
  1556.  
  1557.         tz1=(rx*dy1-ry*dx1)/dy2;
  1558.  
  1559. if (tz1<-1) tz1=-1;
  1560. if (tz1>1) tz1=1;
  1561.  
  1562.         if (tpt3[0]>tpt2[0])
  1563. //        if (rx*dx1<ry*dy1)
  1564.             if (tz1>-.2588)
  1565.                 if (tz1<=.7071)
  1566.                     if (tz1<=.2588)
  1567.                         col-=9;
  1568.                     else
  1569.                         col-=10;
  1570.                 else
  1571.                     {
  1572.                     if (tz1<=.9659)
  1573.                         col-=11;
  1574.                     }
  1575.             else                
  1576.                 if (tz1>-.7071)
  1577.                     col-=8;
  1578.                 else
  1579.                     if (tz1>-.9659)
  1580.                         col-=7;
  1581.                     else
  1582.                         col-=6;
  1583.         else
  1584.             if (tz1<=.2588)
  1585.                 if (tz1>-.7071)
  1586.                     if (tz1>-.2588)
  1587.                         col-=3;
  1588.                     else
  1589.                         col-=4;
  1590.                 else
  1591.                     if (tz1>-.9659)
  1592.                         col-=5;
  1593.                     else
  1594.                         col-=6;
  1595.             else
  1596.                 if (tz1<=.7071)
  1597.                     col-=2;
  1598.                 else
  1599.                     if (tz1<=.9659)
  1600.                         col-=1;
  1601.  
  1602. //        tz1*=tz1;
  1603. //        tz1*=(obf[3]-obf[4])*(obf[3]+obf[4]);
  1604. //        dx2=tz2*sqrt(tz1+obf[4]*obf[4]);
  1605.  
  1606.         tz1*=tz1;
  1607.         tz1*=(obf[3]-obf[4])*(obf[3]+obf[4]);
  1608.         dx2=tz2*sqrt(tz1+obf[4]*obf[4]);
  1609.         dy2=100*(tpt1[0]-tpt2[0])/obf[5];
  1610.  
  1611.         if (dy2>=0)
  1612.             {                   
  1613.             if (dy2>0.555570233)
  1614.                 if (dy2>0.836286155) col-=36;
  1615.                 else col-=24;
  1616.             else
  1617.                 if (dy2>0.195090322) col-=12;
  1618.             dy2*=tz2*sqrt(obf[3]*obf[3]-tz1);
  1619.             tz1=dy2*dx1;
  1620.             tz2=dy2*dy1;
  1621.             dx1*=dx2;
  1622.             dy1*=dx2;
  1623.             curpts[1]=col;
  1624.             curpts[2]=tpt2[1]+dy1-tz1;
  1625.             curpts[3]=tpt2[2]-dx1-tz2;
  1626.             curpts[4]=tpt2[1]-dy1-tz1;
  1627.             curpts[5]=tpt2[2]+dx1-tz2;
  1628.             curpts[6]=tpt1[1]-dy1+tz1;
  1629.             curpts[7]=tpt1[2]+dx1+tz2;
  1630.             curpts[8]=tpt1[1]+dy1+tz1;
  1631.             curpts[9]=tpt1[2]-dx1+tz2;
  1632.             }
  1633.         else
  1634.             {
  1635.             if (dy2<-0.258819045)
  1636.                 if (dy2<-0.707106781) col+=12;
  1637.                 else col+=12;
  1638.             dy2*=tz2*sqrt(obf[3]*obf[3]-tz1);
  1639.             tz1=dy2*dx1;
  1640.             tz2=dy2*dy1;
  1641.             dx1*=dx2;
  1642.             dy1*=dx2;
  1643.             curpts[1]=col;
  1644.             curpts[2]=tpt2[1]+dy1+tz1;
  1645.             curpts[3]=tpt2[2]-dx1+tz2;
  1646.             curpts[4]=tpt2[1]-dy1+tz1;
  1647.             curpts[5]=tpt2[2]+dx1+tz2;
  1648.             curpts[6]=tpt1[1]-dy1-tz1;
  1649.             curpts[7]=tpt1[2]+dx1-tz2;
  1650.             curpts[8]=tpt1[1]+dy1-tz1;
  1651.             curpts[9]=tpt1[2]-dx1-tz2;
  1652.             }
  1653.         curpts+=10;
  1654.           curpol++;                  
  1655.         }
  1656.     }
  1657.  
  1658. // Add polygon to list, with clipping, (note: optimised for unclipped objects)
  1659. void
  1660. addpolyc(face obf,word np,word col)
  1661.     {
  1662.     word p,pc,tp,i;
  1663.     dword *texx,*texy,*texs;
  1664.     rotpt dx1,dy1,dx2,dy2,tz1,tz2,qrz,qrz2;
  1665.     rpt tpt1,tpt2,tpt3;
  1666.  
  1667.     // Unroll first three face points in subsequent code
  1668.     tpt1=&rotlist[obf[0]<<2];
  1669.     tpt2=&rotlist[obf[1]<<2];
  1670.     tpt3=&rotlist[obf[2]<<2];
  1671.  
  1672.     // If any of first 3 pts need clipping, facing check is invalid, so go to clipping code now
  1673.     if ((tz1=tpt1[0])<SCREENDIST||tpt2[0]<SCREENDIST||tpt3[0]<SCREENDIST)
  1674.         {
  1675.         p=0;tz1=0;
  1676.         curpol->pts=curpts;
  1677.         curpts[0]=np;
  1678.         curpts[1]=col;
  1679.         curpts+=2;
  1680.         goto pclip;
  1681.         }
  1682.  
  1683.     // Facing check
  1684.     dx1=dx2=tpt1[1];
  1685.     dy1=dy2=tpt1[2];
  1686.     dx1-=tpt2[1];
  1687.     dy1-=tpt2[2];
  1688.     dx2-=tpt3[1];
  1689.     dy2-=tpt3[2];
  1690.     if (dx1*dy2<dx2*dy1)
  1691.         {
  1692.         // Transfer rotated points to polygon list and 
  1693.         // calculate average z. Go to clipping code if necessary
  1694.         curpol->pts=curpts;
  1695.         curpts[0]=np;
  1696.         curpts[1]=col;
  1697.         curpts[2]=tpt1[1];
  1698.         curpts[3]=tpt1[2];
  1699.         curpts[4]=tpt2[1];
  1700.         curpts[5]=tpt2[2];
  1701.         tz1+=tpt2[0];
  1702.         curpts[6]=tpt3[1];
  1703.         curpts[7]=tpt3[2];
  1704.         tz1+=tpt3[0];
  1705.         curpts+=8;
  1706.         for (p=3;p<np;p++)
  1707.             {
  1708.             tpt1=&rotlist[obf[p]<<2];
  1709.             if ((tz2=tpt1[0])<SCREENDIST) goto pclip; 
  1710.             tz1+=tz2;
  1711.             curpts[0]=tpt1[1];
  1712.             curpts[1]=tpt1[2];
  1713.             curpts+=2;
  1714.             }
  1715.         curpol->z=tz1/np;
  1716.         curpol++;
  1717.         }
  1718.     return;
  1719.  
  1720.     // Polygon needs clipping 
  1721.     pclip:;
  1722.     if (col<0)
  1723.         {
  1724.         // Texture map...
  1725.         if (col<-2000)
  1726.             {
  1727.             texs=(dword *)&textures[-col-2000];
  1728.             col=-2000-clip_tex;
  1729.             }
  1730.         else
  1731.             {
  1732.             texs=(dword *)&textures[-col];
  1733.             col=-clip_tex;
  1734.             }
  1735.         *(curpol->pts+1)=col;
  1736.         texy=(dword *)&textures[clip_tex];
  1737.         texx=(dword *)&textures[++clip_tex];
  1738.         for (i=0;i<p;i++)
  1739.             texy[i]=texs[i];
  1740.         for (i=0;i<p;i++)
  1741.             texx[i]=texs[np+i];
  1742.  
  1743.         tp=(p+np-1)%np;
  1744.         tpt2=&rotlist[obf[tp]<<2];
  1745.         pc=p;
  1746.         do
  1747.             {
  1748.             tz1+=tpt1[0];
  1749.             if (tpt1[0]>=SCREENDIST)
  1750.                 {
  1751.                 if (tpt2[0]<SCREENDIST)
  1752.                     {
  1753.                     qrz=(SCREENDIST-tpt2[0])/(tpt1[0]-tpt2[0]);
  1754.                     qrz2=tpt1[0]/SCREENDIST;
  1755.                     curpts[0]=tpt2[1]+qrz*((tpt1[1]-render_buff.clip_xmid)*qrz2-tpt2[1])+render_buff.clip_xmid;
  1756.                     curpts[1]=tpt2[2]+qrz*((tpt1[2]-render_buff.clip_ymid)*qrz2-tpt2[2])+render_buff.clip_ymid;
  1757.                     curpts+=2;
  1758.  
  1759.                     texy[pc]=texs[tp]+qrz*(texs[p]-texs[tp]);
  1760.                     texx[pc]=texs[tp+np]+qrz*(texs[p+np]-texs[tp+np]);
  1761.  
  1762.                     if (++pc==3)
  1763.                         {
  1764.                         dx1=dx2=curpts[-6];
  1765.                         dy1=dy2=curpts[-5];
  1766.                         dx1-=curpts[-4];
  1767.                         dy1-=curpts[-3];
  1768.                         dx2-=curpts[-2];
  1769.                         dy2-=curpts[-1];
  1770.                         if (dx1*dy2>=dx2*dy1)
  1771.                             {
  1772.                             curpts=curpol->pts;
  1773.                             return;
  1774.                             }
  1775.                         }
  1776.                     }
  1777.                 curpts[0]=tpt1[1];
  1778.                 curpts[1]=tpt1[2];
  1779.                 curpts+=2;
  1780.  
  1781.                 texy[pc]=texs[p];
  1782.                 texx[pc]=texs[p+np];
  1783.  
  1784.                 if (++pc==3)
  1785.                     {
  1786.                     dx1=dx2=curpts[-6];
  1787.                     dy1=dy2=curpts[-5];
  1788.                     dx1-=curpts[-4];
  1789.                     dy1-=curpts[-3];
  1790.                     dx2-=curpts[-2];
  1791.                     dy2-=curpts[-1];
  1792.                     if (dx1*dy2>=dx2*dy1)
  1793.                         {
  1794.                         curpts=curpol->pts;
  1795.                         return;
  1796.                         }
  1797.                     }
  1798.                 }
  1799.             else
  1800.                 if (tpt2[0]>=SCREENDIST)
  1801.                     {
  1802.                     qrz=(SCREENDIST-tpt1[0])/(tpt2[0]-tpt1[0]);
  1803.                     qrz2=tpt2[0]/SCREENDIST;
  1804.                     curpts[0]=tpt1[1]+qrz*((tpt2[1]-render_buff.clip_xmid)*qrz2-tpt1[1])+render_buff.clip_xmid;
  1805.                     curpts[1]=tpt1[2]+qrz*((tpt2[2]-render_buff.clip_ymid)*qrz2-tpt1[2])+render_buff.clip_ymid;
  1806.                     curpts+=2;
  1807.  
  1808.                     texy[pc]=texs[p]+qrz*(texs[tp]-texs[p]);
  1809.                     texx[pc]=texs[p+np]+qrz*(texs[tp+np]-texs[p+np]);
  1810.  
  1811.                     if (++pc==3)
  1812.                         {
  1813.                         dx1=dx2=curpts[-6];
  1814.                         dy1=dy2=curpts[-5];
  1815.                         dx1-=curpts[-4];
  1816.                         dy1-=curpts[-3];
  1817.                         dx2-=curpts[-2];
  1818.                         dy2-=curpts[-1];
  1819.                         if (dx1*dy2>=dx2*dy1)
  1820.                             {
  1821.                             curpts=curpol->pts;
  1822.                             return;
  1823.                             }
  1824.                         }
  1825.                     }
  1826.             tpt2=tpt1;
  1827.             tp=p;
  1828.             tpt1=&rotlist[obf[(++p)%np]<<2];
  1829.             }while (p<np);
  1830.         p%=np;
  1831.         if (tpt1[0]>=SCREENDIST && tpt2[0]<SCREENDIST)
  1832.             {
  1833.             qrz=(SCREENDIST-tpt2[0])/(tpt1[0]-tpt2[0]);
  1834.             qrz2=tpt1[0]/SCREENDIST;
  1835.             curpts[0]=tpt2[1]+qrz*((tpt1[1]-render_buff.clip_xmid)*qrz2-tpt2[1])+render_buff.clip_xmid;
  1836.             curpts[1]=tpt2[2]+qrz*((tpt1[2]-render_buff.clip_ymid)*qrz2-tpt2[2])+render_buff.clip_ymid;
  1837.             curpts+=2;
  1838.  
  1839.             texy[pc]=texs[tp]+qrz*(texs[p]-texs[tp]);
  1840.             texx[pc]=texs[tp+np]+qrz*(texs[p+np]-texs[tp+np]);
  1841.  
  1842.             if (++pc==3)
  1843.                 {
  1844.                 dx1=dx2=curpts[-6];
  1845.                 dy1=dy2=curpts[-5];
  1846.                 dx1-=curpts[-4];
  1847.                 dy1-=curpts[-3];
  1848.                 dx2-=curpts[-2];
  1849.                 dy2-=curpts[-1];
  1850.                 if (dx1*dy2>=dx2*dy1)
  1851.                     {
  1852.                     curpts=curpol->pts;
  1853.                     return;
  1854.                     }
  1855.                 }
  1856.             }
  1857.  
  1858.         for (i=0;i<pc;i++)
  1859.             texy[pc+i]=texx[i];
  1860.         if (pc>4) clip_tex++;
  1861.  
  1862.         }
  1863.     else
  1864.         {
  1865.         tpt2=&rotlist[obf[(p+np-1)%np]<<2];
  1866.         pc=p;
  1867.         do
  1868.             {
  1869.             tz1+=tpt1[0];
  1870.             if (tpt1[0]>=SCREENDIST)
  1871.                 {
  1872.                 if (tpt2[0]<SCREENDIST)
  1873.                     {
  1874.                     qrz=(SCREENDIST-tpt2[0])/(tpt1[0]-tpt2[0]);
  1875.                     qrz2=tpt1[0]/SCREENDIST;
  1876.                     curpts[0]=tpt2[1]+qrz*((tpt1[1]-render_buff.clip_xmid)*qrz2-tpt2[1])+render_buff.clip_xmid;
  1877.                     curpts[1]=tpt2[2]+qrz*((tpt1[2]-render_buff.clip_ymid)*qrz2-tpt2[2])+render_buff.clip_ymid;
  1878.                     curpts+=2;
  1879.                     if (++pc==3)
  1880.                         {
  1881.                         dx1=dx2=curpts[-6];
  1882.                         dy1=dy2=curpts[-5];
  1883.                         dx1-=curpts[-4];
  1884.                         dy1-=curpts[-3];
  1885.                         dx2-=curpts[-2];
  1886.                         dy2-=curpts[-1];
  1887.                         if (dx1*dy2>=dx2*dy1)
  1888.                             {
  1889.                             curpts=curpol->pts;
  1890.                             return;
  1891.                             }
  1892.                         }
  1893.                     }
  1894.                 curpts[0]=tpt1[1];
  1895.                 curpts[1]=tpt1[2];
  1896.                 curpts+=2;
  1897.                 if (++pc==3)
  1898.                     {
  1899.                     dx1=dx2=curpts[-6];
  1900.                     dy1=dy2=curpts[-5];
  1901.                     dx1-=curpts[-4];
  1902.                     dy1-=curpts[-3];
  1903.                     dx2-=curpts[-2];
  1904.                     dy2-=curpts[-1];
  1905.                     if (dx1*dy2>=dx2*dy1)
  1906.                         {
  1907.                         curpts=curpol->pts;
  1908.                         return;
  1909.                         }
  1910.                     }
  1911.                 }
  1912.             else
  1913.                 if (tpt2[0]>=SCREENDIST)
  1914.                     {
  1915.                     qrz=(SCREENDIST-tpt1[0])/(tpt2[0]-tpt1[0]);
  1916.                     qrz2=tpt2[0]/SCREENDIST;
  1917.                     curpts[0]=tpt1[1]+qrz*((tpt2[1]-render_buff.clip_xmid)*qrz2-tpt1[1])+render_buff.clip_xmid;
  1918.                     curpts[1]=tpt1[2]+qrz*((tpt2[2]-render_buff.clip_ymid)*qrz2-tpt1[2])+render_buff.clip_ymid;
  1919.                     curpts+=2;
  1920.                     if (++pc==3)
  1921.                         {
  1922.                         dx1=dx2=curpts[-6];
  1923.                         dy1=dy2=curpts[-5];
  1924.                         dx1-=curpts[-4];
  1925.                         dy1-=curpts[-3];
  1926.                         dx2-=curpts[-2];
  1927.                         dy2-=curpts[-1];
  1928.                         if (dx1*dy2>=dx2*dy1)
  1929.                             {
  1930.                             curpts=curpol->pts;
  1931.                             return;
  1932.                             }
  1933.                         }
  1934.                     }
  1935.             tpt2=tpt1;
  1936.             tpt1=&rotlist[obf[(++p)%np]<<2];
  1937.             }while (p<np);
  1938.         if (tpt1[0]>=SCREENDIST && tpt2[0]<SCREENDIST)
  1939.             {
  1940.             qrz=(SCREENDIST-tpt2[0])/(tpt1[0]-tpt2[0]);
  1941.             qrz2=tpt1[0]/SCREENDIST;
  1942.             curpts[0]=tpt2[1]+qrz*((tpt1[1]-render_buff.clip_xmid)*qrz2-tpt2[1])+render_buff.clip_xmid;
  1943.             curpts[1]=tpt2[2]+qrz*((tpt1[2]-render_buff.clip_ymid)*qrz2-tpt2[2])+render_buff.clip_ymid;
  1944.             curpts+=2;
  1945.             if (++pc==3)
  1946.                 {
  1947.                 dx1=dx2=curpts[-6];
  1948.                 dy1=dy2=curpts[-5];
  1949.                 dx1-=curpts[-4];
  1950.                 dy1-=curpts[-3];
  1951.                 dx2-=curpts[-2];
  1952.                 dy2-=curpts[-1];
  1953.                 if (dx1*dy2>=dx2*dy1)
  1954.                     {
  1955.                     curpts=curpol->pts;
  1956.                     return;
  1957.                     }
  1958.                 }
  1959.             }
  1960.         }
  1961.    // All pts clipped?
  1962.     if (pc==0)
  1963.         curpts=curpol->pts;
  1964.     else
  1965.         {
  1966.         *(curpol->pts)=pc;
  1967.         curpol->z=tz1/np;
  1968.         curpol++;
  1969.         }
  1970.      }
  1971.  
  1972.  
  1973. // Add line to list, with clipping
  1974. void
  1975. addlinec(face obf,word col)
  1976.     {
  1977.     rotpt qrz,qrz2;
  1978.     rpt tpt1,tpt2;
  1979.  
  1980.     // Transfer rotated (/clipped) points to polygon list
  1981.     // and calculate average z
  1982.     tpt1=&rotlist[obf[0]<<2];
  1983.     tpt2=&rotlist[obf[1]<<2];
  1984.     if (tpt1[0]<SCREENDIST)
  1985.         {
  1986.         if (tpt2[0]<SCREENDIST) return;
  1987.         qrz=(SCREENDIST-tpt1[0])/(tpt2[0]-tpt1[0]);
  1988.         qrz2=tpt2[0]/SCREENDIST;
  1989.         curpts[2]=tpt1[1]+qrz*((tpt2[1]-render_buff.clip_xmid)*qrz2-tpt1[1])+render_buff.clip_xmid;
  1990.         curpts[3]=tpt1[2]+qrz*((tpt2[2]-render_buff.clip_ymid)*qrz2-tpt1[2])+render_buff.clip_ymid;
  1991.         }
  1992.     else
  1993.         {
  1994.         curpts[2]=tpt1[1];
  1995.         curpts[3]=tpt1[2];
  1996.         }
  1997.     if (tpt2[0]<SCREENDIST)
  1998.         {
  1999.         qrz=(SCREENDIST-tpt2[0])/(tpt1[0]-tpt2[0]);
  2000.         qrz2=tpt1[0]/SCREENDIST;
  2001.         curpts[4]=tpt2[1]+qrz*((tpt1[1]-render_buff.clip_xmid)*qrz2-tpt2[1])+render_buff.clip_xmid;
  2002.         curpts[5]=tpt2[2]+qrz*((tpt1[2]-render_buff.clip_ymid)*qrz2-tpt2[2])+render_buff.clip_ymid;
  2003.         }
  2004.     else
  2005.         {
  2006.         curpts[4]=tpt2[1];
  2007.         curpts[5]=tpt2[2];
  2008.         }
  2009.     curpol->pts=curpts;
  2010.     curpts[0]=2;
  2011.     curpts[1]=col;
  2012.     curpts+=6;
  2013.     curpol->z=(tpt1[0]+tpt2[0])/2;
  2014.     curpol++;
  2015.     }
  2016.  
  2017.  
  2018. // Add faces to polygon list, with no z clipping
  2019. void addpols(obj *ob)
  2020.     {
  2021.     face obf=ob->faces;
  2022.     word f=*obf++;
  2023.     word np,col;
  2024.  
  2025. #ifdef COUNT
  2026.     numpols+=f;
  2027. #endif
  2028.  
  2029.     while(f--)
  2030.         {
  2031.         np=obf[0];
  2032.         col=obf[1];
  2033.         obf+=2;
  2034.  
  2035.         if (np>2)
  2036.             {
  2037.             addpoly(obf, np, col); 
  2038.             obf+=np;
  2039.             }
  2040.         else
  2041.             if (np==2)
  2042.                 {
  2043.                 addline(obf, col);
  2044.                 obf+=2;
  2045.                 }
  2046.             else
  2047.                  if (np==0)
  2048.                     {
  2049.                     add3dcmap(obf, col);
  2050.                     obf+=4;
  2051.                     }
  2052.                 else
  2053.                     {
  2054.                     add3demap(obf, col);
  2055.                     obf+=6;
  2056.                     }
  2057.         }
  2058.     }
  2059.  
  2060.  
  2061. // Add faces to polygon list, with z clipping
  2062. void addpolsc(obj *ob)
  2063.     {
  2064.     face obf=ob->faces;
  2065.     word f=*obf++;    
  2066.     word np,col;
  2067.  
  2068. #ifdef COUNT
  2069.     numpols+=f;
  2070. #endif
  2071.  
  2072.     while(f--)
  2073.         {
  2074.         np=obf[0];
  2075.         col=obf[1];
  2076.         obf+=2;
  2077.  
  2078.         if (np>2) // Deal with polygons...
  2079.             {
  2080.             addpolyc(obf,np,col);
  2081.             obf+=np;
  2082.             }
  2083.         else    
  2084.             {
  2085.             addlinec(obf,col);
  2086.             obf+=2;
  2087.             }
  2088.         }
  2089.     }
  2090.  
  2091.  
  2092.  
  2093. /******************************************/
  2094. /* ROTATE OBJECTS AND ADD TO POLYGON LIST */
  2095.  
  2096. // Several routines here, for various cases:
  2097. // addobjxy    : objects with x & y axis rotation and no z-clipping
  2098. // addobjy    : objects with y-axis rotation only and no z-clipping
  2099. // addobjyc    : objects with y-axis rotation only with z-clipping
  2100. // addobjn    : objects with no rotation and no z-clipping
  2101. // addobjnc    : objects with no rotation with z-clipping
  2102. // addobjf    : objects with no rotation, all y=0, and no z-clipping
  2103. // addobjfc    : objects with no rotation, all y=0, with z-clipping
  2104.  
  2105.  
  2106. // Routine for objects with x & y axis rotation, no z-clipping
  2107. void addobjxy(obj *ob,floatpt cxrot,floatpt sxrot)
  2108.     {
  2109.     pt inpt=ob->points;
  2110.     rpt outpt=rotlist;
  2111.     word p=(word)*inpt++; // No of pts currently stored as datapt type!
  2112.     datapt x,y,z;
  2113.     floatpt crot,srot;
  2114.     rotpt    rx,ry,rz,qrz;
  2115.  
  2116.     // Get object depth
  2117.     if ((curobj->z=objdep(*ob))>CUTOFFDIST)
  2118.     {
  2119.     curobj->polys=curpol;
  2120.  
  2121.     // Transform matrix derived from view rotation and object rotation
  2122.     // Assumes r01=0 in view rotation
  2123.     crot=ob->crot;
  2124.     srot=ob->srot;
  2125.     x=ob->x;          
  2126.     y=ob->y;
  2127.     z=ob->z;
  2128. /*
  2129.     tran.e.r00=rot.e.r00*crot-rot.e.r02*srot*cxrot; // Rotate in x then y
  2130.     tran.e.r01=rot.e.r02*sxrot;
  2131.     tran.e.r02=rot.e.r00*srot+rot.e.r02*crot*cxrot;
  2132.     tran.e.r03=rot.e.r00*x+rot.e.r01*y+rot.e.r02*z+rot.e.r03;
  2133.     tran.e.r10=rot.e.r10*crot-rot.e.r11*srot*sxrot-rot.e.r12*srot*cxrot;
  2134.     tran.e.r11=rot.e.r11*cxrot+rot.e.r12*sxrot;
  2135.     tran.e.r12=rot.e.r10*srot-rot.e.r11*crot*sxrot+rot.e.r12*crot*cxrot;
  2136.     tran.e.r13=rot.e.r10*x+rot.e.r11*y+rot.e.r12*z+rot.e.r13;
  2137.     tran.e.r20=rot.e.r20*crot-rot.e.r21*srot*sxrot-rot.e.r22*srot*cxrot;
  2138.     tran.e.r21=rot.e.r21*cxrot+rot.e.r22*sxrot;
  2139.     tran.e.r22=rot.e.r20*srot-rot.e.r21*crot*sxrot+rot.e.r22*crot*cxrot;
  2140.     tran.e.r23=rot.e.r20*x+rot.e.r21*y+rot.e.r22*z+rot.e.r23;
  2141. */
  2142.     tran.e.r00= rot.e.r00*crot-rot.e.r02*srot;        // Rotate in y then x
  2143.     tran.e.r01=-rot.e.r00*srot*sxrot-rot.e.r02*crot*sxrot;
  2144.     tran.e.r02= rot.e.r00*srot*cxrot+rot.e.r02*crot*cxrot;
  2145.     tran.e.r03= rot.e.r00*x+rot.e.r01*y+rot.e.r02*z+rot.e.r03;
  2146.     tran.e.r10= rot.e.r10*crot-rot.e.r12*srot;
  2147.     tran.e.r11=-rot.e.r10*srot*sxrot+rot.e.r11*cxrot-rot.e.r12*crot*sxrot;
  2148.     tran.e.r12= rot.e.r10*srot*cxrot+rot.e.r11*sxrot+rot.e.r12*crot*cxrot;
  2149.     tran.e.r13= rot.e.r10*x+rot.e.r11*y+rot.e.r12*z+rot.e.r13;
  2150.     tran.e.r20= rot.e.r20*crot-rot.e.r22*srot;
  2151.     tran.e.r21=-rot.e.r20*srot*sxrot+rot.e.r21*cxrot-rot.e.r22*crot*sxrot;
  2152.     tran.e.r22= rot.e.r20*srot*cxrot+rot.e.r21*sxrot+rot.e.r22*crot*cxrot;
  2153.     tran.e.r23= rot.e.r20*x+rot.e.r21*y+rot.e.r22*z+rot.e.r23;
  2154.  
  2155.     // Rotate all points of object
  2156.     for (;p;p--)
  2157.         {
  2158.         x=inpt[0];
  2159.         y=inpt[1];
  2160.         z=inpt[2];
  2161.         inpt+=3;
  2162.         rx=x*tran.e.r00+y*tran.e.r01+z*tran.e.r02+tran.e.r03;
  2163.         ry=x*tran.e.r10+y*tran.e.r11+z*tran.e.r12+tran.e.r13;
  2164.         rz=x*tran.e.r20+y*tran.e.r21+z*tran.e.r22+tran.e.r23;
  2165.  
  2166.         // Get perspective scaling of point
  2167.         if (rz<SCREENDIST)
  2168.             {
  2169.             qrz=1.5-rz*scrdr;     // Alternative perspective scaling...
  2170.             qrz*=qrz;                  //    mimics proper perspective for small...    
  2171.             qrz=persc*(qrz+.75);    // and negative z values.
  2172.             }
  2173.         else
  2174.             qrz=q/rz;    // Normal scaling
  2175.  
  2176.         //Add screen points to output list (with z values)
  2177.         outpt[0]=rz;
  2178.         outpt[1]=rx*qrz+render_buff.clip_xmid;
  2179.         outpt[2]=ry*qrz+render_buff.clip_ymid;
  2180.         outpt+=4;    // add 4 so indexing can be done with shifts
  2181.         }
  2182.     addpols(ob);
  2183.     curobj->nopols=curpol-curobj->polys;
  2184.     curobj++;
  2185.     }
  2186.     }
  2187.  
  2188.  
  2189. // Routine for objects with y axis rotation, no z-clipping
  2190. void addobjy(obj *ob)
  2191.     {
  2192.     pt inpt=ob->points;
  2193.     rpt outpt=rotlist;
  2194.     word p=(word)*inpt++; // No of pts currently stored as datapt type!
  2195.     datapt x,y,z;
  2196.     floatpt crot,srot;
  2197.     rotpt    rx,ry,rz,qrz;
  2198.  
  2199.  
  2200.     // Get object depth
  2201.     if ((curobj->z=objdep(*ob))>CUTOFFDIST)
  2202.     {
  2203.     curobj->polys=curpol;
  2204.  
  2205.     // Transform matrix derived from view rotation and object rotation
  2206.     // Assumes r01=0 in view rotation and that r11 & r21 remain the same
  2207.     crot=ob->crot;
  2208.     srot=ob->srot;
  2209.     x=ob->x;
  2210.     y=ob->y;
  2211.     z=ob->z;
  2212.     tran.e.r00=rot.e.r00*crot-rot.e.r02*srot;
  2213.     tran.e.r02=rot.e.r00*srot+rot.e.r02*crot;
  2214.     tran.e.r03=rot.e.r00*x+rot.e.r01*y+rot.e.r02*z+rot.e.r03;
  2215.     tran.e.r10=rot.e.r10*crot-rot.e.r12*srot;
  2216.     tran.e.r12=rot.e.r10*srot+rot.e.r12*crot;
  2217.     tran.e.r13=rot.e.r10*x+rot.e.r11*y+rot.e.r12*z+rot.e.r13;
  2218.     tran.e.r20=rot.e.r20*crot-rot.e.r22*srot;
  2219.     tran.e.r22=rot.e.r20*srot+rot.e.r22*crot;
  2220.     tran.e.r23=rot.e.r20*x+rot.e.r21*y+rot.e.r22*z+rot.e.r23;
  2221.  
  2222.     // Rotate all points of object
  2223.     for (;p;p--)
  2224.         {
  2225.         x=inpt[0];
  2226.         y=inpt[1];
  2227.         z=inpt[2];
  2228.         inpt+=3;
  2229.         rx=x*tran.e.r00+z*tran.e.r02+tran.e.r03; // r01 is 0
  2230.         ry=x*tran.e.r10+y*rot.e.r11+z*tran.e.r12+tran.e.r13;
  2231.         rz=x*tran.e.r20+y*rot.e.r21+z*tran.e.r22+tran.e.r23;
  2232.  
  2233.         // Get perspective scaling of point
  2234.         if (rz<SCREENDIST)
  2235.             {
  2236.             qrz=1.5-rz*scrdr;     // Alternative perspective scaling...
  2237.             qrz*=qrz;                  //    mimics proper perspective for small...    
  2238.             qrz=persc*(qrz+.75);    // and negative z values.
  2239. /*
  2240.             qrz=2-rz*scrdr;        // Improved alternative perspective..
  2241.             qrz=qrz*qrz*qrz;       // slightly higher complexity.
  2242.             qrz=persc*(qrz+2);
  2243.             qrz/=3;
  2244. */            }
  2245.         else
  2246.             qrz=q/rz;    // Normal scaling
  2247.  
  2248.         //Add screen points to output list (with z values)
  2249.         outpt[0]=rz;
  2250.         outpt[1]=rx*qrz+render_buff.clip_xmid;
  2251.         outpt[2]=ry*qrz+render_buff.clip_ymid;
  2252.         outpt+=4;    // add 4 so indexing can be done with shifts
  2253.         }
  2254.     addpols(ob);
  2255.     curobj->nopols=curpol-curobj->polys;
  2256.     curobj++;
  2257.     }
  2258.     }
  2259.  
  2260. // Routine for objects with y axis rotation, no z-clipping, z flipped (only players)
  2261. void addobjyf(obj *ob)
  2262.     {
  2263.     pt inpt=ob->points;
  2264.     rpt outpt=rotlist;
  2265.     word p=(word)*inpt++; // No of pts currently stored as datapt type!
  2266.     datapt x,y,z;
  2267.     floatpt crot,srot;
  2268.     rotpt    rx,ry,rz,qrz;
  2269.  
  2270.  
  2271.     // Get object depth
  2272.     if ((curobj->z=objdep(*ob))>CUTOFFDIST)
  2273.     {
  2274.     curobj->polys=curpol;
  2275.  
  2276.     // Transform matrix derived from view rotation and object rotation
  2277.     // Assumes r01=0 in view rotation and that r11 & r21 remain the same
  2278.     crot=ob->crot;
  2279.     srot=ob->srot;
  2280.     x=ob->x;
  2281.     y=ob->y;
  2282.     z=ob->z;
  2283.     tran.e.r00=rot.e.r00*crot-rot.e.r02*srot;
  2284.     tran.e.r02=rot.e.r00*srot+rot.e.r02*crot;
  2285.     tran.e.r03=rot.e.r00*x+rot.e.r01*y+rot.e.r02*z+rot.e.r03;
  2286.     tran.e.r10=rot.e.r10*crot-rot.e.r12*srot;
  2287.     tran.e.r12=rot.e.r10*srot+rot.e.r12*crot;
  2288.     tran.e.r13=rot.e.r10*x+rot.e.r11*y+rot.e.r12*z+rot.e.r13;
  2289.     tran.e.r20=rot.e.r20*crot-rot.e.r22*srot;
  2290.     tran.e.r22=rot.e.r20*srot+rot.e.r22*crot;
  2291.     tran.e.r23=rot.e.r20*x+rot.e.r21*y+rot.e.r22*z+rot.e.r23;
  2292.  
  2293.     // Rotate all points of object
  2294.     for (;p;p--)
  2295.         {
  2296.         x=inpt[0];
  2297.         y=inpt[1];
  2298.         z=-inpt[2];
  2299.         inpt+=3;
  2300.         rx=x*tran.e.r00+z*tran.e.r02+tran.e.r03; // r01 is 0
  2301.         ry=x*tran.e.r10+y*rot.e.r11+z*tran.e.r12+tran.e.r13;
  2302.         rz=x*tran.e.r20+y*rot.e.r21+z*tran.e.r22+tran.e.r23;
  2303.  
  2304.         // Get perspective scaling of point
  2305.         if (rz<SCREENDIST)
  2306.             {
  2307.             qrz=1.5-rz*scrdr;     // Alternative perspective scaling...
  2308.             qrz*=qrz;                  //    mimics proper perspective for small...    
  2309.             qrz=persc*(qrz+.75);    // and negative z values.
  2310. /*
  2311.             qrz=2-rz*scrdr;        // Improved alternative perspective..
  2312.             qrz=qrz*qrz*qrz;       // slightly higher complexity.
  2313.             qrz=persc*(qrz+2);
  2314.             qrz/=3;
  2315. */            }
  2316.         else
  2317.             qrz=q/rz;    // Normal scaling
  2318.  
  2319.         //Add screen points to output list (with z values)
  2320.         outpt[0]=rz;
  2321.         outpt[1]=rx*qrz+render_buff.clip_xmid;
  2322.         outpt[2]=ry*qrz+render_buff.clip_ymid;
  2323.         outpt+=4;    // add 4 so indexing can be done with shifts
  2324.         }
  2325.     addpols(ob);
  2326.     curobj->nopols=curpol-curobj->polys;
  2327.     curobj++;
  2328.     }
  2329.     }
  2330.  
  2331.  
  2332. // Routine for objects with y axis rotation & z-clipping
  2333. void addobjyc(obj *ob)
  2334.     {
  2335.     pt inpt=ob->points;
  2336.     rpt outpt=rotlist;
  2337.     word p=(word)*inpt++; // No of pts currently stored as datapt type!
  2338.     datapt x,y,z;
  2339.     floatpt crot,srot;
  2340.     rotpt    rx,ry,rz,qrz;
  2341.  
  2342.     // Get object depth
  2343.     curobj->z=objdep(*ob);
  2344.     curobj->polys=curpol;
  2345.  
  2346.     // Transform matrix derived from view rotation and object rotation
  2347.     // Assumes r01=0 in view rotation and that r11 & r21 remain the same
  2348.     crot=ob->crot;
  2349.     srot=ob->srot;
  2350.     x=ob->x;
  2351.     y=ob->y;
  2352.     z=ob->z;
  2353.     tran.e.r00=rot.e.r00*crot-rot.e.r02*srot;
  2354.     tran.e.r02=rot.e.r00*srot+rot.e.r02*crot;
  2355.     tran.e.r03=rot.e.r00*x+rot.e.r01*y+rot.e.r02*z+rot.e.r03;
  2356.     tran.e.r10=rot.e.r10*crot-rot.e.r12*srot;
  2357.     tran.e.r12=rot.e.r10*srot+rot.e.r12*crot;
  2358.     tran.e.r13=rot.e.r10*x+rot.e.r11*y+rot.e.r12*z+rot.e.r13;
  2359.     tran.e.r20=rot.e.r20*crot-rot.e.r22*srot;
  2360.     tran.e.r22=rot.e.r20*srot+rot.e.r22*crot;
  2361.     tran.e.r23=rot.e.r20*x+rot.e.r21*y+rot.e.r22*z+rot.e.r23;
  2362.  
  2363.     // Rotate all points of object
  2364.     for (;p;p--)
  2365.         {
  2366.         x=inpt[0];
  2367.         y=inpt[1];
  2368.         z=inpt[2];
  2369.         inpt+=3;
  2370.         rx=x*tran.e.r00+z*tran.e.r02+tran.e.r03; // r01 is 0
  2371.         ry=x*tran.e.r10+y*rot.e.r11+z*tran.e.r12+tran.e.r13;
  2372.         rz=x*tran.e.r20+y*rot.e.r21+z*tran.e.r22+tran.e.r23;
  2373.  
  2374.         // Get perspective scaling & add screen points to output list (with z values)
  2375.         outpt[0]=rz;
  2376.         if (rz<SCREENDIST)
  2377.             {
  2378.             outpt[1]=rx*persc;    //These values used in clip calculation
  2379.             outpt[2]=ry*persc;
  2380.             }
  2381.         else
  2382.             {
  2383.             qrz=q/rz;    // Normal scaling
  2384.             outpt[1]=rx*qrz+render_buff.clip_xmid;
  2385.             outpt[2]=ry*qrz+render_buff.clip_ymid;
  2386.             }
  2387.         outpt+=4;    // add 4 so indexing can be done with shifts
  2388.         }
  2389.     addpolsc(ob);
  2390.     curobj->nopols=curpol-curobj->polys;
  2391.     curobj++;
  2392.     }
  2393.  
  2394.  
  2395. // Routine for objects with no rotation, no z-clipping
  2396. void addobjn(obj *ob)
  2397.     {
  2398.     pt inpt=ob->points;
  2399.     rpt outpt=rotlist;
  2400.     word p=(word)*inpt++; // No of pts currently stored as datapt type!
  2401.     datapt x,y,z,tranx,trany,tranz;
  2402.     rotpt    rx,ry,rz,qrz;
  2403.  
  2404.     // Get object depth
  2405.     if ((curobj->z=objdep(*ob))>CUTOFFDIST)
  2406.     {
  2407.     curobj->polys=curpol;
  2408.  
  2409.     tranx=ob->x;
  2410.     trany=ob->y;
  2411.     tranz=ob->z;
  2412.     // Rotate all points of object
  2413.     for (;p;p--)
  2414.         {
  2415.         x=tranx+inpt[0];
  2416.         y=trany+inpt[1];
  2417.         z=tranz+inpt[2];
  2418.         inpt+=3;
  2419.         rx=x*rot.e.r00+z*rot.e.r02+rot.e.r03; // r01 is 0
  2420.         ry=x*rot.e.r10+y*rot.e.r11+z*rot.e.r12+rot.e.r13;
  2421.         rz=x*rot.e.r20+y*rot.e.r21+z*rot.e.r22+rot.e.r23;
  2422.  
  2423.         // Get perspective scaling of point
  2424.         if (rz<SCREENDIST)
  2425.             {
  2426.             qrz=1.5-rz*scrdr;     // Alternative perspective scaling...
  2427.             qrz*=qrz;                  //    mimics proper perspective for small...    
  2428.             qrz=persc*(qrz+.75);    // and negative z values.
  2429.             }
  2430.         else
  2431.             qrz=q/rz;    // Normal scaling
  2432.  
  2433.         //Add screen points to output list (with z values)
  2434.         outpt[0]=rz;
  2435.         outpt[1]=rx*qrz+render_buff.clip_xmid;
  2436.         outpt[2]=ry*qrz+render_buff.clip_ymid;
  2437.         outpt+=4;    // add 4 so indexing can be done with shifts
  2438.         }
  2439.     addpols(ob);
  2440.     curobj->nopols=curpol-curobj->polys;
  2441.     curobj++;
  2442.     }
  2443.     }
  2444.  
  2445.  
  2446. // Routine for sprite objects (no rotation, no z-clipping)
  2447. void addobjsp(datapt *sprpt, word *refpt)
  2448.     {
  2449.     word p=(word)*(sprpt++); // No of sprites currently stored as datapt type!
  2450.     datapt x,y,z;
  2451.     rotpt    rx,ry,rz,qrz;
  2452.  
  2453.     // Rotate all sprite points and add to polygon list for sorting
  2454.     for (;p;p--)
  2455.         {
  2456.         curobj->polys=curpol;
  2457.         x=sprpt[0];
  2458.         y=sprpt[1];
  2459.         z=sprpt[2];
  2460.         sprpt+=3;
  2461.         rx=x*rot.e.r00+z*rot.e.r02+rot.e.r03; // r01 is 0
  2462.         ry=x*rot.e.r10+y*rot.e.r11+z*rot.e.r12+rot.e.r13;
  2463.         rz=x*rot.e.r20+y*rot.e.r21+z*rot.e.r22+rot.e.r23;
  2464.  
  2465.         // Get perspective scaling of point
  2466.         if (rz<SCREENDIST)
  2467.             {
  2468.             qrz=1.5-rz*scrdr;     // Alternative perspective scaling...
  2469.             qrz*=qrz;                  //    mimics proper perspective for small...    
  2470.             qrz=persc*(qrz+.75);    // and negative z values.
  2471.             }
  2472.         else
  2473.             qrz=q/rz;    // Normal scaling
  2474.  
  2475.         rx=rx*qrz+render_buff.clip_xmid;
  2476.         if (rz<CUTOFFDIST)
  2477.             if (rx>=0)
  2478.                  rx=render_buff.clip_wid<<1;
  2479.             else
  2480.                 rx=-render_buff.clip_wid;
  2481.  
  2482.          curpol->pts=curpts;
  2483.         curobj->z=curpol->z=rz; 
  2484.         curpts[0]=1;
  2485.         curpts[1]=*(refpt++);
  2486.         curpts[2]=rx;
  2487.         curpts[3]=ry*qrz+render_buff.clip_ymid;
  2488.         curpts+=4;
  2489.         curpol++;
  2490.         curobj->nopols=1;
  2491.         curobj++;
  2492.         }
  2493.     }
  2494.  
  2495.  
  2496. // Routine for objects with no rotation & z-clipping
  2497. void addobjnc(obj *ob)
  2498.     {
  2499.     pt inpt=ob->points;
  2500.     rpt outpt=rotlist;
  2501.     word p=(word)*inpt++; // No of pts currently stored as datapt type!
  2502.     datapt x,y,z,tranx,trany,tranz;
  2503.     rotpt    rx,ry,rz,qrz;
  2504.  
  2505.     // Get object depth
  2506.     curobj->z=objdep(*ob);
  2507.     curobj->polys=curpol;
  2508.  
  2509.     tranx=ob->x;
  2510.     trany=ob->y;
  2511.     tranz=ob->z;
  2512.     // Rotate all points of object
  2513.     for (;p;p--)
  2514.         {
  2515.         x=tranx+inpt[0];
  2516.         y=trany+inpt[1];
  2517.         z=tranz+inpt[2];
  2518.         inpt+=3;
  2519.         rx=x*rot.e.r00+z*rot.e.r02+rot.e.r03; // r01 is 0
  2520.         ry=x*rot.e.r10+y*rot.e.r11+z*rot.e.r12+rot.e.r13;
  2521.         rz=x*rot.e.r20+y*rot.e.r21+z*rot.e.r22+rot.e.r23;
  2522.  
  2523.         // Get perspective scaling & add screen points to output list (with z values)
  2524.         outpt[0]=rz;
  2525.         if (rz<SCREENDIST)
  2526.             {
  2527.             outpt[1]=rx*persc;    //These values used in clip calculation
  2528.             outpt[2]=ry*persc;
  2529.             }
  2530.         else
  2531.             {
  2532.             qrz=q/rz;    // Normal scaling
  2533.             outpt[1]=rx*qrz+render_buff.clip_xmid;
  2534.             outpt[2]=ry*qrz+render_buff.clip_ymid;
  2535.             }
  2536.         outpt+=4;    // add 4 so indexing can be done with shifts
  2537.         }
  2538.     addpolsc(ob);
  2539.     curobj->nopols=curpol-curobj->polys;
  2540.     curobj++;
  2541.     }
  2542.  
  2543.  
  2544. // Routine for objects with no rotation and all y=0, no z-clipping
  2545. void addobjf(obj *ob)
  2546.     {
  2547.     pt inpt=ob->points;
  2548.     rpt outpt=rotlist;
  2549.     word p=(word)*inpt++; // No of pts currently stored as datapt type!
  2550.     datapt x,z,tranx,tranz;
  2551.     rotpt    rx,ry,rz,qrz;
  2552.  
  2553.     // Get object depth
  2554.     if ((curobj->z=objdep(*ob))>CUTOFFDIST)
  2555.     {
  2556.     curobj->polys=curpol;
  2557.  
  2558.     tranx=ob->x;
  2559.     tranz=ob->z;
  2560.     // Rotate all points of object
  2561.     for (;p;p--)
  2562.         {
  2563.         x=tranx+inpt[0];
  2564.         z=tranz+inpt[2];
  2565.         inpt+=3;
  2566.         rx=x*rot.e.r00+z*rot.e.r02+rot.e.r03;
  2567.         ry=x*rot.e.r10+z*rot.e.r12+rot.e.r13;
  2568.         rz=x*rot.e.r20+z*rot.e.r22+rot.e.r23;
  2569.  
  2570.         // Get perspective scaling of point
  2571.         if (rz<SCREENDIST)
  2572.             {
  2573.             qrz=1.5-rz*scrdr;     // Alternative perspective scaling...
  2574.             qrz*=qrz;                  //    mimics proper perspective for small...    
  2575.             qrz=persc*(qrz+.75);    // and negative z values.
  2576.             }
  2577.         else
  2578.             qrz=q/rz;    // Normal scaling
  2579.  
  2580.         //Add screen points to output list (with z values)
  2581.         outpt[0]=rz;
  2582.         outpt[1]=rx*qrz+render_buff.clip_xmid;
  2583.         outpt[2]=ry*qrz+render_buff.clip_ymid;
  2584.         outpt+=4;    // add 4 so indexing can be done with shifts
  2585.         }
  2586.     addpols(ob);
  2587.     curobj->nopols=curpol-curobj->polys;
  2588.     curobj++;
  2589.     }
  2590.     }
  2591.  
  2592.  
  2593. // Routine for objects with no rotation and all y=0, with z-clipping
  2594. void addobjfc(obj *ob)
  2595.     {
  2596.     pt inpt=ob->points;
  2597.     rpt outpt=rotlist;
  2598.     word p=(word)*inpt++; // No of pts currently stored as datapt type!
  2599.     datapt x,z,tranx,tranz;
  2600.     rotpt    rx,ry,rz,qrz;
  2601.  
  2602.     // Get object depth
  2603.     curobj->z=objdep(*ob);
  2604.     curobj->polys=curpol;
  2605.  
  2606.     tranx=ob->x;
  2607.     tranz=ob->z;
  2608.     // Rotate all points of object
  2609.     for (;p;p--)
  2610.         {
  2611.         x=tranx+inpt[0];
  2612.         z=tranz+inpt[2];
  2613.         inpt+=3;
  2614.         rx=x*rot.e.r00+z*rot.e.r02+rot.e.r03;
  2615.         ry=x*rot.e.r10+z*rot.e.r12+rot.e.r13;
  2616.         rz=x*rot.e.r20+z*rot.e.r22+rot.e.r23;
  2617.  
  2618.         // Get perspective scaling & add screen points to output list (with z values)
  2619.           outpt[0]=rz;
  2620.         if (rz<SCREENDIST)
  2621.             {
  2622.             outpt[1]=rx*persc;    //These values used in clip calculation
  2623.             outpt[2]=ry*persc;
  2624.             }
  2625.         else
  2626.             {
  2627.             qrz=q/rz;    // Normal scaling
  2628.             outpt[1]=rx*qrz+render_buff.clip_xmid;
  2629.             outpt[2]=ry*qrz+render_buff.clip_ymid;
  2630.             }
  2631.         outpt+=4;    // add 4 so indexing can be done with shifts
  2632.         }
  2633.     addpolsc(ob);
  2634.     curobj->nopols=curpol-curobj->polys;
  2635.     curobj++;
  2636.     }
  2637.  
  2638.  
  2639.  
  2640.  
  2641. /************************************************/
  2642. /* SORT, DISPLAY AND RESET OBJECT/POLYGON LISTS */
  2643.  
  2644. // Macro to reset object/polygon/point lists
  2645. #define clearlists curobj=objlist,curpol=pollist,curpts=ptslist;
  2646.  
  2647.  
  2648. // Object depth comparison for qsort
  2649. int objcmp(void const *obj1, void const *obj2)
  2650.     {
  2651.     // Avoids unnessecary float to int conversions, assumes true=1
  2652.     return (((objs *)obj1)->z<=((objs *)obj2)->z ? ((objs *)obj1)->z<((objs *)obj2)->z : -1);
  2653.     }
  2654.  
  2655.  
  2656. // Polygon depth comparison for qsort
  2657. int polcmp(void const *pol1, void const *pol2)
  2658.     {
  2659.     // Avoids unnessecary float to int conversions, assumes true=1
  2660.     return (((pols *)pol1)->z<=((pols *)pol2)->z ? ((pols *)pol1)->z<((pols *)pol2)->z : -1);
  2661.     }
  2662.  
  2663.  
  2664. // Sort the polygons within a single object
  2665. #define sortobj(ob) qsort((ob)->polys,(ob)->nopols,sizeof(pols),polcmp);
  2666.  
  2667.  
  2668. // Draw polygons after sorting
  2669. void
  2670. dispols()
  2671.     {
  2672.     objs *cobj=objlist;
  2673.     short i,n;
  2674.     word np,col;
  2675.     dword *polytex;
  2676.  
  2677.     // Sort objects from z value
  2678.     qsort(objlist,curobj-objlist,sizeof(objs),objcmp);
  2679.  
  2680.     // Draw the polygons associated with the sorted list
  2681.     while (cobj!=curobj)
  2682.         {
  2683.         n=cobj->nopols;
  2684.         curpol=cobj++->polys;
  2685.         for (i=0;i<n;i++)
  2686.             {
  2687.             curpts=curpol++->pts;
  2688.             np=(word)curpts[0];
  2689.             col=(word)curpts[1];
  2690.             curpts+=2;
  2691.  
  2692. if (col>=512) col=257;
  2693.  
  2694.             // Choose routine to use from np & col
  2695.             if (col<-2000)
  2696.                  {
  2697.                 polytex=(dword *)&textures[-col-2000];
  2698.                 polyt((pnt *)curpts,np,mapsel[*(((BYTE *)polytex)+3)],polytex+np,polytex);
  2699.                 continue;
  2700.                 }
  2701.             if (col<0)
  2702.                  {
  2703.                 polytex=(dword *)&textures[-col];
  2704.                 polym((pnt *)curpts,np,mapsel[*(((BYTE *)polytex)+3)],polytex+np,polytex);
  2705.                 continue;
  2706.                 }
  2707.             if (col>=512)
  2708.                  {
  2709.                 polytex=(dword *)&texloop[(col&255)].tex;
  2710. //                polytex=(dword *)&textures[(col&255)+S_TM];
  2711.                 polyl((pnt *)curpts,np,mapsel[mappages-2+(col&255)],polytex+np,polytex);
  2712. //                polyl((pnt *)curpts,np,mapsel[mappages-2+(col>>8)],polytex+np,polytex);
  2713.                 continue;
  2714.                 }
  2715.             if (col>=256)
  2716.                  {
  2717.                 polyf((pnt *)curpts,np,filters[col&255]);
  2718.                 continue;
  2719.                 }
  2720.             if (np<=2)                     
  2721.                 if (np==1)
  2722.                     {sprite3d(curpts[0]/render_buff.scale_x,(render_buff.clip_hgt-curpts[1])/render_buff.scale_y,col);curpts+=2;}
  2723.                 else           
  2724.                     line((pnt *)curpts,col);
  2725.             else
  2726.                 polyb((pnt *)curpts,np,col);
  2727.             }
  2728.      
  2729.         }
  2730.         clearlists
  2731.     }
  2732.  
  2733.  
  2734. // Draw flat polys on 3D Blaster
  2735. void dispols3DB()
  2736.     {
  2737.     objs *cobj=objlist;
  2738.     short i,j,k,n;
  2739.     word np,p,pt,pl,col;
  2740.     CGL_VERTEX2D_ST *pts3d,*lpts3d;
  2741.     CGL_COLOR_ST *col3d,*lcol3d;
  2742.     int tpts1[24];
  2743.     int tpts2[24];
  2744.     int cp;
  2745.  
  2746.     pts3d=&Vertex[0];
  2747.     col3d=&Colour[0];
  2748.     lpts3d=&lVertex[0];
  2749.     lcol3d=&lColour[0];
  2750.  
  2751.     // Draw the polygons associated with the sorted list
  2752.     while (cobj!=curobj)
  2753.         {
  2754.         n=cobj->nopols;
  2755.         curpol=cobj++->polys;
  2756.         for (i=0;i<n;i++)
  2757.             {
  2758.             curpts=curpol++->pts;
  2759.             np=(word)curpts[0]<<1;
  2760.             col=(word)curpts[1];
  2761.             curpts+=2;
  2762.  
  2763.             p=0;
  2764.             for (j=0;j<np;j+=2)
  2765.                 {
  2766.                 k=j+2;
  2767.                 if (k==np) k=0;
  2768.                 if (curpts[j]>=0)
  2769.                     if (curpts[k]>=0)
  2770.                         {
  2771.                         tpts1[p++]=curpts[k];
  2772.                         tpts1[p++]=curpts[k+1];
  2773.                         }
  2774.                     else
  2775.                         {
  2776.                         tpts1[p++]=0;
  2777.                         tpts1[p++]=curpts[j+1]+((curpts[k+1]-curpts[j+1])*curpts[j])/(curpts[j]-curpts[k]);
  2778.                         }
  2779.                 else
  2780.                     if (curpts[k]>=0)
  2781.                         {
  2782.                         if (np!=4)
  2783.                             {
  2784.                             tpts1[p++]=0;
  2785.                             tpts1[p++]=curpts[k+1]+((curpts[j+1]-curpts[k+1])*curpts[k])/(curpts[k]-curpts[j]);
  2786.                             }
  2787.                         tpts1[p++]=curpts[k];
  2788.                         tpts1[p++]=curpts[k+1];
  2789.                         }
  2790.                 }
  2791.  
  2792.             pt=0;
  2793.             for (j=0;j<p;j+=2)
  2794.                 {
  2795.                 k=j+2;
  2796.                 if (k==p) k=0;
  2797.                 if (tpts1[j]<=render_buff.clip_wid)
  2798.                     if (tpts1[k]<=render_buff.clip_wid)
  2799.                         {
  2800.                         tpts2[pt++]=tpts1[k];
  2801.                         tpts2[pt++]=tpts1[k+1];
  2802.                         }
  2803.                     else
  2804.                         {
  2805.                         tpts2[pt++]=render_buff.clip_wid;
  2806.                         tpts2[pt++]=tpts1[j+1]+((tpts1[k+1]-tpts1[j+1])*(render_buff.clip_wid-tpts1[j]))/(tpts1[k]-tpts1[j]);
  2807.                         }
  2808.                 else
  2809.                     if (tpts1[k]<=render_buff.clip_wid)
  2810.                         {
  2811.                         if (np!=4)
  2812.                             {
  2813.                             tpts2[pt++]=render_buff.clip_wid;
  2814.                             tpts2[pt++]=tpts1[k+1]+((tpts1[j+1]-tpts1[k+1])*(render_buff.clip_wid-tpts1[k]))/(tpts1[j]-tpts1[k]);
  2815.                             }
  2816.                         tpts2[pt++]=tpts1[k];
  2817.                         tpts2[pt++]=tpts1[k+1];
  2818.                         }
  2819.                 }
  2820.  
  2821.             cp=((np==4)?1:0);
  2822.             p=0;
  2823.             for (j=0;j<pt;j+=2)
  2824.                 {
  2825.                 k=j+2;
  2826.                 if (k==pt) k=0;
  2827.                 if (tpts2[j+1]>=cp)
  2828.                     if (tpts2[k+1]>=cp)
  2829.                         {
  2830.                         tpts1[p++]=tpts2[k];
  2831.                         tpts1[p++]=tpts2[k+1];
  2832.                         }
  2833.                     else
  2834.                         {
  2835.                         tpts1[p++]=tpts2[j]+((tpts2[k]-tpts2[j])*tpts2[j+1])/(tpts2[j+1]-tpts2[k+1]);
  2836.                         tpts1[p++]=cp;
  2837.                         }
  2838.                 else
  2839.                     if (tpts2[k+1]>=cp)
  2840.                         {
  2841.                         if (np!=4)
  2842.                             {
  2843.                             tpts1[p++]=tpts2[k]+((tpts2[j]-tpts2[k])*tpts2[k+1])/(tpts2[k+1]-tpts2[j+1]);
  2844.                             tpts1[p++]=cp;
  2845.                             }
  2846.                         tpts1[p++]=tpts2[k];
  2847.                         tpts1[p++]=tpts2[k+1];
  2848.                         }
  2849.                 }
  2850.  
  2851.             pt=0;
  2852.             for (j=0;j<p;j+=2)
  2853.                 {
  2854.                 k=j+2;
  2855.                 if (k==p) k=0;
  2856.                 if (tpts1[j+1]<=render_buff.clip_hgtl)
  2857.                     if (tpts1[k+1]<=render_buff.clip_hgtl)
  2858.                         {
  2859.                         pts3d[pt].x=tpts1[k]<<16;
  2860.                         pts3d[pt++].y=tpts1[k+1]<<16;
  2861.                         }
  2862.                     else
  2863.                         {
  2864.                         pts3d[pt].x=(tpts1[j]+((tpts1[k]-tpts1[j])*(render_buff.clip_hgt-tpts1[j+1]))/(tpts1[k+1]-tpts1[j+1]))<<16;
  2865.                         pts3d[pt++].y=render_buff.clip_hgtl<<16;
  2866.                         }
  2867.                 else
  2868.                     if (tpts1[k+1]<=render_buff.clip_hgtl)
  2869.                         {
  2870.                         if (np!=4)
  2871.                             {
  2872.                             pts3d[pt].x=(tpts1[k]+((tpts1[j]-tpts1[k])*(render_buff.clip_hgt-tpts1[k+1]))/(tpts1[j+1]-tpts1[k+1]))<<16;
  2873.                             pts3d[pt++].y=render_buff.clip_hgtl<<16;
  2874.                             }
  2875.                         pts3d[pt].x=tpts1[k]<<16;
  2876.                         pts3d[pt++].y=tpts1[k+1]<<16;
  2877.                         }
  2878.                 }
  2879.  
  2880.             p=0;
  2881.             pl=pt;
  2882.             while (pl>4)
  2883.                 {
  2884.                 p+=4;
  2885.                 pt+=2;
  2886.                 pl-=2;
  2887.                 for (j=pt-1;j>p;j--)
  2888.                     {
  2889.                     pts3d[j].x=pts3d[j-2].x;
  2890.                     pts3d[j].y=pts3d[j-2].y;
  2891.                     }
  2892.                 pts3d[p].x=pts3d[0].x;
  2893.                 pts3d[p].y=pts3d[0].y;
  2894.                 }
  2895.             p+=pl;
  2896.             if (pl<=3)
  2897.                 {
  2898.                 if (pl==3)
  2899.                     {
  2900.                     pts3d[p].x=pts3d[0].x;
  2901.                     pts3d[p].y=pts3d[0].y;
  2902.                     p++;
  2903.                     }
  2904.                 else
  2905.                     if (pl==2)
  2906.                         {
  2907.                         if (pts3d[0].y<0x20000) pts3d[0].y=0x20000;
  2908.                         if (pts3d[1].y<0x20000) pts3d[1].y=0x20000;
  2909.                         lpts3d[0].x=pts3d[0].x;
  2910.                         lpts3d[0].y=pts3d[0].y;
  2911.                         lpts3d[1].x=pts3d[1].x;
  2912.                         lpts3d[1].y=pts3d[1].y;
  2913.                         lcol3d->bRed=col;
  2914.                         lcol3d+=2;
  2915.                         lpts3d+=2;
  2916.                         goto dpline;
  2917.                         }
  2918.                 }
  2919.             while (p)
  2920.                 {
  2921.                 col3d->bRed=col;
  2922.                 col3d+=4;
  2923.                 pts3d+=4;
  2924.                 p-=4;
  2925.                 }
  2926.             dpline:;
  2927.             }
  2928.         }
  2929.  
  2930.     SetLineOutput3DB();
  2931.     if ((p=lpts3d-lVertex)>0)
  2932.         Render3DB(p);
  2933.  
  2934.     SetFlatQuadOutput3DB();
  2935.     if ((p=pts3d-Vertex)>0)
  2936.         Render3DB(p);
  2937.  
  2938.     clearlists
  2939.     }
  2940.  
  2941.  
  2942. // Draw polygons without sorting
  2943. void dispolsn()
  2944.     {
  2945.     objs *cobj=objlist;
  2946.     short i,n;
  2947.     word np,col;
  2948.     dword *polytex;
  2949.  
  2950.     while (cobj!=curobj)
  2951.         {
  2952.         n=cobj->nopols;
  2953.         curpol=cobj++->polys;
  2954.         for (i=0;i<n;i++)
  2955.             {
  2956.             curpts=curpol++->pts;
  2957.             np=(word)curpts[0];
  2958.             col=(word)curpts[1];
  2959.             curpts+=2;
  2960.  
  2961. if (col>=512) col=257;
  2962.  
  2963.             // Choose routine to use from np & col
  2964.             if (col<-2000)
  2965.                  {
  2966.                 polytex=(dword *)&textures[-col-2000];
  2967.                 polyt((pnt *)curpts,np,mapsel[*(((BYTE *)polytex)+3)],polytex+np,polytex);
  2968.                 continue;
  2969.                 }
  2970.             if (col<0)
  2971.                  {
  2972.                 polytex=(dword *)&textures[-col];
  2973.                 polym((pnt *)curpts,np,mapsel[*(((BYTE *)polytex)+3)],polytex+np,polytex);
  2974.                 continue;
  2975.                 }
  2976.             if (col>=512)
  2977.                  {
  2978.                 polytex=(dword *)&texloop[(col&255)].tex;
  2979. //                polytex=(dword *)&textures[(col&255)+S_TM];
  2980.                 polyl((pnt *)curpts,np,mapsel[mappages-2+(col&255)],polytex+np,polytex);
  2981. //                 polyl((pnt *)curpts,np,mapsel[mappages-2+(col>>8)],polytex+np,polytex);
  2982.                 continue;
  2983.                 }
  2984.             if (col>=256)
  2985.                  {
  2986.                 polyf((pnt *)curpts,np,filters[col&255]);
  2987.                 continue;
  2988.                 }
  2989.             if (np<=2)
  2990.                 if (np==1)
  2991.                     {sprite3d(curpts[0]/render_buff.scale_x,(render_buff.clip_hgt-curpts[1])/render_buff.scale_y,col);curpts+=2;}
  2992.                 else           
  2993.                     line((pnt *)curpts,col);
  2994.             else
  2995.                 polyb((pnt *)curpts,np,col);
  2996.             }
  2997.  
  2998.         }
  2999.         clearlists
  3000.     }
  3001.  
  3002.  
  3003. // Draw sorted texture maps on 3D Blaster
  3004. void dispolst3DB()
  3005.     {
  3006.     objs *cobj=objlist;
  3007.     short i,j,k,n;
  3008.     word np,p,pt,pl,col;
  3009.     float fc;
  3010.     CGL_VERTEX2D_ST *pts3d;
  3011.     CGL_TEXTURE2D_ST *tex3d;
  3012.     CGL_COLOR_ST *col3d;
  3013.     int tpts1[16];
  3014.     int tpts2[16];
  3015.     int ttex1[16];
  3016.     int ttex2[16];
  3017.     dword *polytexx,*polytexy,pmx;
  3018.  
  3019.     pts3d=&Vertex[0];
  3020.     tex3d=&Texture[0];
  3021.     // Draw the polygons associated with the sorted list
  3022.     while (cobj!=curobj)
  3023.         {
  3024.         n=cobj->nopols;
  3025.         curpol=cobj++->polys;
  3026.         for (i=0;i<n;i++)
  3027.             {
  3028.             curpts=curpol++->pts;
  3029.             if ((np=(word)curpts[0])<3) goto errpol;
  3030.             col=(word)curpts[1];
  3031.             curpts+=2;
  3032.  
  3033.             if (col<0)
  3034.                 {
  3035.                 if (col<-2000) col+=2000;
  3036.                 polytexy=(dword *)&textures[-col];
  3037.                 polytexx=polytexy+np;
  3038.                 pmx=(*polytexy&0xc000000)>>2;
  3039.                 np<<=1;        
  3040.                 p=0;
  3041.                 for (j=0;j<np;j+=2)
  3042.                     {
  3043.                     k=j+2;
  3044.                     if (k==np) k=0;
  3045.                     if (curpts[j]>=0)
  3046.                         if (curpts[k]>=0)
  3047.                             {
  3048.                             tpts1[p]=curpts[k];
  3049.                             ttex1[p++]=(polytexx[k>>1]|pmx);
  3050.                             tpts1[p]=curpts[k+1];
  3051.                             ttex1[p++]=polytexy[k>>1]&0x3ffffff;
  3052.                             }
  3053.                         else
  3054.                             {
  3055.                             fc=(float)curpts[j]/(curpts[j]-curpts[k]);
  3056.                             tpts1[p]=0;
  3057.                             ttex1[p++]=((polytexx[j>>1]+(int)(fc*(polytexx[k>>1]-polytexx[j>>1])))|pmx);
  3058.                             tpts1[p]=curpts[j+1]+(int)(fc*(curpts[k+1]-curpts[j+1]));
  3059.                             ttex1[p++]=(polytexy[j>>1]+(int)(fc*(polytexy[k>>1]-polytexy[j>>1])))&0x3ffffff;
  3060.                             }
  3061.                     else
  3062.                         if (curpts[k]>=0)
  3063.                             {
  3064.                             fc=(float)curpts[k]/(curpts[k]-curpts[j]);
  3065.                             tpts1[p]=0;
  3066.                             ttex1[p++]=((polytexx[k>>1]+(int)(fc*(polytexx[j>>1]-polytexx[k>>1])))|pmx);
  3067.                             tpts1[p]=curpts[k+1]+(int)(fc*(curpts[j+1]-curpts[k+1]));
  3068.                             ttex1[p++]=(polytexy[k>>1]+(int)(fc*(polytexy[j>>1]-polytexy[k>>1])))&0x3ffffff;
  3069.                             tpts1[p]=curpts[k];
  3070.                             ttex1[p++]=(polytexx[k>>1]|pmx);
  3071.                             tpts1[p]=curpts[k+1];
  3072.                             ttex1[p++]=polytexy[k>>1]&0x3ffffff;
  3073.                             }
  3074.                     }
  3075.                 }
  3076.             else
  3077.                 {
  3078. if (col>=512) col=257;
  3079.                 if (col==256) col=9;
  3080.                 if (col==257) col=24;
  3081.                 if (!col) col=2;
  3082.                 pmx=0x1008000|(col<<16);
  3083.                 np<<=1;        
  3084.                 p=0;
  3085.                 for (j=0;j<np;j+=2)
  3086.                     {
  3087.                     k=j+2;
  3088.                     if (k==np) k=0;
  3089.                     if (curpts[j]>=0)
  3090.                         if (curpts[k]>=0)
  3091.                             {
  3092.                             tpts1[p]=curpts[k];
  3093.                             ttex1[p++]=pmx;
  3094.                             tpts1[p]=curpts[k+1];
  3095.                             ttex1[p++]=0x3508000;
  3096.                             }
  3097.                         else
  3098.                             {
  3099.                             fc=(float)curpts[j]/(curpts[j]-curpts[k]);
  3100.                             tpts1[p]=0;
  3101.                             ttex1[p++]=pmx;
  3102.                             tpts1[p]=curpts[j+1]+(int)(fc*(curpts[k+1]-curpts[j+1]));
  3103.                             ttex1[p++]=0x3508000;
  3104.                             }
  3105.                     else
  3106.                         if (curpts[k]>=0)
  3107.                             {
  3108.                             fc=(float)curpts[k]/(curpts[k]-curpts[j]);
  3109.                             tpts1[p]=0;
  3110.                             ttex1[p++]=pmx;
  3111.                             tpts1[p]=curpts[k+1]+(int)(fc*(curpts[j+1]-curpts[k+1]));
  3112.                             ttex1[p++]=0x3508000;
  3113.                             tpts1[p]=curpts[k];
  3114.                             ttex1[p++]=pmx;
  3115.                             tpts1[p]=curpts[k+1];
  3116.                             ttex1[p++]=0x3508000;
  3117.                             }
  3118.                     }
  3119.                 }
  3120.  
  3121.             pt=0;
  3122.             for (j=0;j<p;j+=2)
  3123.                 {
  3124.                 k=j+2;
  3125.                 if (k==p) k=0;
  3126.                 if (tpts1[j]<=render_buff.clip_wid)
  3127.                     if (tpts1[k]<=render_buff.clip_wid)
  3128.                         {
  3129.                         tpts2[pt]=tpts1[k];
  3130.                         ttex2[pt++]=ttex1[k];
  3131.                         tpts2[pt]=tpts1[k+1];
  3132.                         ttex2[pt++]=ttex1[k+1];
  3133.                         }
  3134.                     else
  3135.                         {
  3136.                         fc=(float)(render_buff.clip_wid-tpts1[j])/(tpts1[k]-tpts1[j]);
  3137.                         tpts2[pt]=render_buff.clip_wid;
  3138.                         ttex2[pt++]=ttex1[j]+(int)(fc*(ttex1[k]-ttex1[j]));
  3139.                         tpts2[pt]=tpts1[j+1]+(int)(fc*(tpts1[k+1]-tpts1[j+1]));
  3140.                         ttex2[pt++]=ttex1[j+1]+(int)(fc*(ttex1[k+1]-ttex1[j+1]));
  3141.                         }
  3142.                 else
  3143.                     if (tpts1[k]<=render_buff.clip_wid)
  3144.                         {
  3145.                         fc=(float)(render_buff.clip_wid-tpts1[k])/(tpts1[j]-tpts1[k]);
  3146.                         tpts2[pt]=render_buff.clip_wid;
  3147.                         ttex2[pt++]=ttex1[k]+(int)(fc*(ttex1[j]-ttex1[k]));
  3148.                         tpts2[pt]=tpts1[k+1]+(int)(fc*(tpts1[j+1]-tpts1[k+1]));
  3149.                         ttex2[pt++]=ttex1[k+1]+(int)(fc*(ttex1[j+1]-ttex1[k+1]));
  3150.                         tpts2[pt]=tpts1[k];
  3151.                         ttex2[pt++]=ttex1[k];
  3152.                         tpts2[pt]=tpts1[k+1];
  3153.                         ttex2[pt++]=ttex1[k+1];
  3154.                         }
  3155.                 }
  3156.  
  3157.             p=0;
  3158.             for (j=0;j<pt;j+=2)
  3159.                 {
  3160.                 k=j+2;
  3161.                 if (k==pt) k=0;
  3162.                 if (tpts2[j+1]>=0)
  3163.                     if (tpts2[k+1]>=0)
  3164.                         {
  3165.                         tpts1[p]=tpts2[k];
  3166.                         ttex1[p++]=ttex2[k];
  3167.                         tpts1[p]=tpts2[k+1];
  3168.                         ttex1[p++]=ttex2[k+1];
  3169.                         }
  3170.                     else
  3171.                         {
  3172.                         fc=(float)tpts2[j+1]/(tpts2[j+1]-tpts2[k+1]);
  3173.                         tpts1[p]=tpts2[j]+(int)(fc*(tpts2[k]-tpts2[j]));
  3174.                         ttex1[p++]=ttex2[j]+(int)(fc*(ttex2[k]-ttex2[j]));
  3175.                         tpts1[p]=0;
  3176.                         ttex1[p++]=ttex2[j+1]+(int)(fc*(ttex2[k+1]-ttex2[j+1]));
  3177.                         }
  3178.                 else
  3179.                     if (tpts2[k+1]>=0)
  3180.                         {
  3181.                         fc=(float)tpts2[k+1]/(tpts2[k+1]-tpts2[j+1]);
  3182.                         tpts1[p]=tpts2[k]+(int)(fc*(tpts2[j]-tpts2[k]));
  3183.                         ttex1[p++]=ttex2[k]+(int)(fc*(ttex2[j]-ttex2[k]));
  3184.                         tpts1[p]=0;
  3185.                         ttex1[p++]=ttex2[k+1]+(int)(fc*(ttex2[j+1]-ttex2[k+1]));
  3186.                         tpts1[p]=tpts2[k];
  3187.                         ttex1[p++]=ttex2[k];
  3188.                         tpts1[p]=tpts2[k+1];
  3189.                         ttex1[p++]=ttex2[k+1];
  3190.                         }
  3191.                 }
  3192.  
  3193.             pt=0;
  3194.             for (j=0;j<p;j+=2)
  3195.                 {
  3196.                 k=j+2;
  3197.                 if (k==p) k=0;
  3198.                 if (tpts1[j+1]<=render_buff.clip_hgtl)
  3199.                     if (tpts1[k+1]<=render_buff.clip_hgtl)
  3200.                         {
  3201.                         pts3d[pt].x=tpts1[k]<<16;
  3202.                         tex3d[pt].s=ttex1[k];
  3203.                         pts3d[pt].y=tpts1[k+1]<<16;
  3204.                         tex3d[pt++].t=ttex1[k+1];
  3205.                         }
  3206.                     else
  3207.                         {
  3208.                         fc=(float)(render_buff.clip_hgtl-tpts1[j+1])/(tpts1[k+1]-tpts1[j+1]);
  3209.                         pts3d[pt].x=(tpts1[j]+(int)(fc*(tpts1[k]-tpts1[j])))<<16;
  3210.                         tex3d[pt].s=ttex1[j]+(int)(fc*(ttex1[k]-ttex1[j]));
  3211.                         pts3d[pt].y=render_buff.clip_hgtl<<16;
  3212.                         tex3d[pt++].t=ttex1[j+1]+(int)(fc*(ttex1[k+1]-ttex1[j+1]));
  3213.                         }
  3214.                 else
  3215.                     if (tpts1[k+1]<=render_buff.clip_hgtl)
  3216.                         {
  3217.                         fc=(float)(render_buff.clip_hgtl-tpts1[k+1])/(tpts1[j+1]-tpts1[k+1]);
  3218.                         pts3d[pt].x=(tpts1[k]+(int)(fc*(tpts1[j]-tpts1[k])))<<16;
  3219.                         tex3d[pt].s=ttex1[k]+(int)(fc*(ttex1[j]-ttex1[k]));
  3220.                         pts3d[pt].y=render_buff.clip_hgtl<<16;
  3221.                         tex3d[pt++].t=ttex1[k+1]+(int)(fc*(ttex1[j+1]-ttex1[k+1]));
  3222.                         pts3d[pt].x=tpts1[k]<<16;
  3223.                         tex3d[pt].s=ttex1[k];
  3224.                         pts3d[pt].y=tpts1[k+1]<<16;
  3225.                         tex3d[pt++].t=ttex1[k+1];
  3226.                         }
  3227.                 }
  3228.  
  3229.             p=0;
  3230.             pl=pt;
  3231.             while (pl>4)
  3232.                 {
  3233.                 p+=4;
  3234.                 pt+=2;
  3235.                 pl-=2;
  3236.                 for (j=pt-1;j>p;j--)
  3237.                     {
  3238.                     pts3d[j].x=pts3d[j-2].x;
  3239.                     pts3d[j].y=pts3d[j-2].y;
  3240.                     tex3d[j].s=tex3d[j-2].s;
  3241.                     tex3d[j].t=tex3d[j-2].t;
  3242.                     }
  3243.                 pts3d[p].x=pts3d[0].x;
  3244.                 pts3d[p].y=pts3d[0].y;
  3245.                 tex3d[p].s=tex3d[0].s;
  3246.                 tex3d[p].t=tex3d[0].t;
  3247.                 }
  3248.             p+=pl;
  3249.             if (pl==3)
  3250.                 {
  3251.                 pts3d[p].x=pts3d[0].x;
  3252.                 pts3d[p].y=pts3d[0].y;
  3253.                 tex3d[p].s=tex3d[0].s;
  3254.                 tex3d[p].t=tex3d[0].t;
  3255.                 p++;
  3256.                 }
  3257.             pts3d+=p;
  3258.             tex3d+=p;
  3259.             errpol:;
  3260.             }
  3261.         }
  3262.  
  3263.     SetTextureQuadOutput3DB(texaddr3DB[0]);
  3264.     if ((p=pts3d-Vertex)>0)
  3265.         Render3DB(p);
  3266.     clearlists
  3267.     }
  3268.  
  3269.  
  3270.  
  3271. // Draw polygons without sorting (overlapping polys)
  3272. void dispolsnx()
  3273.     {
  3274.     objs *cobj=objlist;
  3275.     short i,n;
  3276.     word np,col;
  3277.     dword *polytex;
  3278.  
  3279.     while (cobj!=curobj)
  3280.         {
  3281.         n=cobj->nopols;
  3282.         curpol=cobj++->polys;
  3283.         for (i=0;i<n;i++)
  3284.             {
  3285.             curpts=curpol++->pts;
  3286.             np=(word)curpts[0];
  3287.             col=(word)curpts[1];
  3288.             curpts+=2;
  3289.  
  3290. if (col>=512) col=257;
  3291.             
  3292.             // Choose routine to use from np & col
  3293.             if (col<-2000)
  3294.                  {
  3295.                 polytex=(dword *)&textures[-col-2000];
  3296.                 polyt((pnt *)curpts,np,mapsel[*(((BYTE *)polytex)+3)],polytex+np,polytex);
  3297.                 continue;
  3298.                 }
  3299.             if (col<0)
  3300.                  {
  3301.                 polytex=(dword *)&textures[-col];
  3302.                 polym((pnt *)curpts,np,mapsel[*(((BYTE *)polytex)+3)],polytex+np,polytex);
  3303.                 continue;
  3304.                 }
  3305.             if (col>=512)
  3306.                  {
  3307.                 polytex=(dword *)&texloop[(col&255)].tex;
  3308. //                polytex=(dword *)&textures[(col&255)+S_TM];
  3309.                 polyl((pnt *)curpts,np,mapsel[mappages-2+(col&255)],polytex+np,polytex);
  3310. //                 polyl((pnt *)curpts,np,mapsel[mappages-2+(col>>8)],polytex+np,polytex);
  3311.                 continue;
  3312.                 }
  3313.             if (col>=256)
  3314.                  {
  3315.                 polyf((pnt *)curpts,np,filters[col&255]);
  3316.                 continue;
  3317.                 }
  3318.             if (np<=2)
  3319.                 if (np==1)
  3320.                     {sprite3d(curpts[0]/render_buff.scale_x,(render_buff.clip_hgt-curpts[1])/render_buff.scale_y,col);curpts+=2;}
  3321.                 else           
  3322.                     line((pnt *)curpts,col);
  3323.             else
  3324.                 poly((pnt *)curpts,np,col);
  3325.             }
  3326.  
  3327.         }
  3328.         clearlists
  3329.     }
  3330.  
  3331.  
  3332.  
  3333. /********************/
  3334. /* PALETTE ROUTINES */
  3335.  
  3336. /*
  3337. // Set palette
  3338. void setpal()
  3339.     {
  3340.     short i;
  3341.     unsigned char *p=pal;
  3342.     for (i=0;i<256;i++)
  3343.         {
  3344.         outp(0x3c8,i);
  3345.         outp(0x3c9,*p++);
  3346.         outp(0x3c9,*p++);
  3347.         outp(0x3c9,*p++);
  3348.         }
  3349.     }
  3350.  
  3351. // Get palette
  3352. void getpal()
  3353.     {
  3354.     short i;
  3355.     unsigned char *p=pal;
  3356.     for (i=0;i<256;i++)
  3357.         {
  3358.         outp(0x3c7,i);
  3359.         *p++=inp(0x3c9);
  3360.         *p++=inp(0x3c9);
  3361.         *p++=inp(0x3c9);
  3362.         }
  3363.     }
  3364. */
  3365.  
  3366. void setpal()
  3367.     {
  3368.     union REGS regs;
  3369.     struct SREGS sregs;
  3370.     memset(&sregs,0,sizeof(sregs));
  3371.     regs.w.ax=0x1012;
  3372.     regs.w.bx=0;
  3373.     regs.w.cx=256;
  3374.     regs.x.edx=FP_OFF(&pal[0]);
  3375.     sregs.es=FP_SEG(&pal[0]);
  3376.     int386x(0x10,®s,®s,&sregs);
  3377.     }
  3378.  
  3379. /*
  3380. void getpal()
  3381.     {
  3382.     union REGS regs;
  3383.     struct SREGS sregs;
  3384.     memset(&sregs,0,sizeof(sregs));
  3385.     regs.w.ax=0x1017;
  3386.     regs.w.bx=0;
  3387.     regs.w.cx=256;
  3388.     regs.x.edx=FP_OFF(&pal[0]);
  3389.     sregs.es=FP_SEG(&pal[0]);
  3390.     int386x(0x10,®s,®s,&sregs);
  3391.     }
  3392.  
  3393. void readcolour(unsigned short c,unsigned char r,unsigned char g,unsigned char b)
  3394.     {
  3395.     union REGS regs;
  3396.     regs.w.ax=0x1010;
  3397.     regs.w.bx=c;
  3398.     regs.h.ch=g;
  3399.     regs.h.cl=b;
  3400.     regs.h.dh=r;
  3401.     int386(0x10,®s,®s);
  3402.     }
  3403.  
  3404. void writecolour(unsigned short c,unsigned char *r,unsigned char *g,unsigned char *b)
  3405.     {
  3406.     union REGS regs;
  3407.     regs.w.ax=0x1015;
  3408.     regs.w.bx=c;
  3409.     int386(0x10,®s,®s);
  3410.     *g=regs.h.ch;
  3411.     *b=regs.h.cl;
  3412.     *r=regs.h.dh;
  3413.     }
  3414. */
  3415.  
  3416. // Make a filter array for polygon filters
  3417. void makefilter(filter filt,byte fr,byte fg,byte fb,float mr,float mg,float mb)
  3418.     {
  3419.     word r1,g1,b1,r2,g2,b2;
  3420.     word x,s,c,l1,l2,d1,d2;
  3421.     if ((l1=sqrt(fr*fr+fg*fg+fb*fb))==0) l1=1;
  3422.     for (x=0;x<768;x+=3)     
  3423.         {
  3424.         l2=sqrt(pal[x]*pal[x]+pal[x+1]*pal[x+1]+pal[x+2]*pal[x+2]);
  3425.         r1=pal[x]+mr*(fr*l2/l1-pal[x]);
  3426.         if (r1<0) r1=0;if (r1>255) r1=255;
  3427.         g1=pal[x+1]+mg*(fg*l2/l1-pal[x+1]);
  3428.         if (g1<0) g1=0;if (g1>255) g1=255;
  3429.         b1=pal[x+2]+mb*(fb*l2/l1-pal[x+2]);
  3430.         if (b1<0) b1=0;if (b1>255) b1=255;
  3431.         r1=(fr-pal[x])*mr+pal[x];
  3432.         g1=(fg-pal[x+1])*mg+pal[x+1];
  3433.         b1=(fb-pal[x+2])*mb+pal[x+2];
  3434.         d1=128;
  3435.         for (s=0;s<768-16*3;s+=3)
  3436.             {
  3437.              r2=(pal[s]-r1);
  3438.             g2=(pal[s+1]-g1);
  3439.             b2=(pal[s+2]-b1);
  3440.             d2=sqrt(r2*r2+g2*g2+b2*b2);
  3441.             if (d2<d1) d1=d2,c=s;
  3442.             }
  3443.         filt[x/3]=c/3;
  3444.         }
  3445.     }
  3446.  
  3447.  
  3448. void makehilite(filter filt,short add)
  3449.     {
  3450.     short s;
  3451.     for (s=0;s<256;s++)
  3452.         filt[s]=(s&15)+add;
  3453.     }
  3454.  
  3455.  
  3456. /*******************/
  3457. /* (S)VGA ROUTINES */
  3458.  
  3459. // Set standard VGA mode
  3460. void VGAmode(BYTE mode)
  3461.     {
  3462.      union REGS r;
  3463.     r.h.al=(char)mode;
  3464.     r.h.ah=0;
  3465.     int386(0x10,&r,&r);
  3466.     }
  3467.  
  3468.  
  3469. // Switch screen mode through VESAmode list & MCGA (0x13)
  3470. //  or through 3dBlaster modes
  3471. void switchmode()
  3472.     {
  3473.     short i;
  3474.     if (scrmode3DB<0)
  3475.         {
  3476.         if (scrmode==0x13)
  3477.              {
  3478.             testVESA=0;
  3479.             scrmode=VESAmode(&modelist[i=0]);
  3480.             while (scrmode!=modelist[i] && ++i!=VESAMODES);
  3481.             if (i!=VESAMODES)
  3482.                 main_buff=VESA_buff[i][setup.screen_size];
  3483.             else
  3484.                 scrmode=0x13;
  3485.             }
  3486.         else
  3487.             {
  3488.               VGAmode(0x13);
  3489.             main_buff=MCGA_buff[setup.screen_size];
  3490.             scrmode=0x13;
  3491.             }
  3492.         setpal();
  3493.         }
  3494.     else
  3495.         {
  3496. #ifdef BLASTDEMO
  3497.         if (++scrmode3DB==MODES_3DB||(scrmode3DB=ChangeScreenMode3DB(modelist3DB+scrmode3DB))<0)
  3498.             scrmode3DB=ChangeScreenMode3DB(modelist3DB);
  3499. #else
  3500.         switch (scrmode3DB)
  3501.             {
  3502.             case 0: scrmode3DB=ChangeScreenMode3DB(&modelist3DB[1]);break;
  3503.             case 3: scrmode3DB=ChangeScreenMode3DB(&modelist3DB[2]);break;
  3504.             case 5: scrmode3DB=ChangeScreenMode3DB(&modelist3DB[0]);break;
  3505.             }
  3506. #endif
  3507.         main_buff=buff_3DB[scrmode3DB];
  3508.         pal[3]=pal[4]=pal[5]=63;
  3509.         pal[191*3]=pal[191*3+1]=pal[191*3+2]=0;
  3510.           SetPalette3DB(pal);
  3511.         }
  3512.     }
  3513.  
  3514. // Clear virtual buffer
  3515. void vclear(BYTE *buffpt,short w,short h,short bw,char fill)
  3516.     {
  3517.     short i;
  3518.     for (i=0;i<h;i++)
  3519.         {
  3520.         memset(buffpt,fill,w);
  3521.         buffpt+=bw;
  3522.         }
  3523.     }
  3524.  
  3525. // Clear buffer
  3526. void clearbuffer(buff_info *buffer,char fill)
  3527.     {
  3528.     vclear(buffer->buff_start,buffer->clip_wid,buffer->clip_hgt,buffer->buff_wid,fill);
  3529.     }
  3530.     
  3531. // Copy buffer to current MCGA screen
  3532. void mcgacpy(BYTE *buffpt,short x,short y,short w,short h,short bw)
  3533.     {
  3534.     short i;
  3535.     char *scrpt;
  3536.     scrpt=(char *)0xa0000+x+320*y;
  3537.     for (i=0;i<h;i++)
  3538.         memcpy(scrpt,buffpt,w),buffpt+=bw,scrpt+=320;
  3539.     }
  3540.  
  3541.  
  3542. // Copy buffer to current VESA screen
  3543. void svgacpy(BYTE *buffpt,short x,short y,short w,short h,short bw)
  3544.     {
  3545.     union REGS regs;
  3546.     short i,co;
  3547.     char *scrpt;
  3548.     int scrdisp=x+Vbytesperline*y;
  3549.     char bank=scrdisp/winrange;
  3550.  
  3551.     if (w<1||h<1) return;
  3552.     scrdisp%=winrange;
  3553.     scrpt=(char *)0xa0000+scrdisp;
  3554.     regs.x.eax=0x4f05;
  3555.     regs.x.ebx=0;
  3556.     regs.x.edx=bank;
  3557.     int386(16,®s,®s);
  3558.     do
  3559.         {
  3560.         co=min((winrange-scrdisp)/Vbytesperline,h);
  3561.         for (i=0;i<co;i++)
  3562.             {
  3563.             memcpy(scrpt,buffpt,w);
  3564.             scrpt+=Vbytesperline;
  3565.             buffpt+=bw;
  3566.             h--;
  3567.             }
  3568.         if (h)
  3569.             {
  3570.             scrdisp=(scrdisp+(co+1)*Vbytesperline)%winrange;
  3571.             co=min(Vbytesperline-scrdisp,w);
  3572.             memcpy(scrpt,buffpt,co);
  3573.              bank++;     
  3574.              regs.x.eax=0x4f05;
  3575.              regs.x.ebx=0;
  3576.              regs.x.edx=bank;
  3577.               int386(16,®s,®s);
  3578.              if (co!=w) 
  3579.                 memcpy((char *)0xa0000,buffpt+co,w-co);
  3580.             scrpt=(char *)0xa0000+scrdisp;
  3581.             buffpt+=bw;
  3582.             h--;
  3583.              }
  3584.         }while (h);
  3585.     regs.x.eax=0x4f05;
  3586.     regs.x.ebx=0;
  3587.     regs.x.edx=0;
  3588.     int386(16,®s,®s);
  3589.     }
  3590.  
  3591.  
  3592.  
  3593. /***********************/
  3594. /* BINARY SAVE ROUTINE */
  3595.     
  3596. int writebin(char *BinFile, BYTE *fPtr, int fLen)
  3597. {
  3598.     int fHandle, fCount;
  3599.     short fDone, fTry;
  3600.  
  3601.     if ((fHandle = open((char *)BinFile, O_CREAT | O_RDWR | O_BINARY, S_IWRITE)) != -1)
  3602.     {
  3603.         fCount = fDone = fTry = 0;
  3604.         while (fCount != fLen && fDone == fTry)
  3605.         {
  3606.             fTry = min(fLen - fCount, 32766);
  3607.             fDone = write(fHandle, fPtr + fCount, fTry);
  3608.             fCount += fDone;
  3609.         }
  3610.         if (fDone != fTry)
  3611.             fCount = -1;
  3612.         close(fHandle);
  3613.     }
  3614.     else
  3615.         fCount = -1;
  3616.     return (fCount);
  3617. }
  3618.  
  3619.  
  3620. BYTE *readbin(char *BinFile, BYTE *fPtr, dword *fLen)
  3621. {
  3622.     int fHandle, fCount;
  3623.     short fDone, fTry;
  3624.     BYTE *fRes = fPtr;
  3625.  
  3626.     if ((fHandle = open((char *)BinFile, O_RDONLY | O_BINARY)) != -1)
  3627.     {
  3628.         *fLen = filelength(fHandle);
  3629.          if (fPtr != NULL || (fPtr = (BYTE *)mallocx(*fLen)) != NULL)
  3630.         {
  3631.             fCount = fDone = fTry = 0;
  3632.             while (fCount != *fLen && fDone == fTry)
  3633.             {
  3634.                 fTry = min(*fLen - fCount, 32766);
  3635.                 fDone = read(fHandle, fPtr + fCount, fTry);
  3636.                 fCount += fDone;
  3637.             }
  3638.             if (fDone != fTry)
  3639.             {
  3640.                 if (fRes == NULL)
  3641.                     freex(fPtr);
  3642.                     fPtr = NULL;
  3643.             }
  3644.         }
  3645.         close(fHandle);
  3646.     }
  3647.     else
  3648.         fPtr = NULL;
  3649.     return (fPtr);
  3650. }
  3651.  
  3652. BYTE *readrawfile(char *filename, BYTE *address)
  3653.     {
  3654.     BYTE *ptr;
  3655.     dword len;
  3656.     if ((ptr=readbin(filename, address, &len))==NULL)
  3657.         printf("Error loading file %s\n",filename);
  3658.     return (ptr);
  3659.     }
  3660.  
  3661. #ifdef JAPAN
  3662. char datafile[]="actrend.dat";
  3663. char dataoffs[]="actrend.off";
  3664. char fapfile[]="fapj.dat";
  3665. char fapoffs[]="fapj.off";
  3666. #else
  3667. #ifndef FLOPPY
  3668. char datafile[]="actrend.dat";
  3669. char dataoffs[]="actrend.off";
  3670. char fapfile[]="fap.dat";
  3671. char fapoffs[]="fap.off";
  3672. #else
  3673. #ifndef BBS
  3674. char datafile[]="actrendf.dat";
  3675. char dataoffs[]="actrendf.off";
  3676. char fapfile[]="fapf.dat";
  3677. char fapoffs[]="fapf.off";
  3678. #else
  3679. char datafile[]="actrendb.dat";
  3680. char dataoffs[]="actrendb.off";
  3681. char fapfile[]="fapf.dat";
  3682. char fapoffs[]="fapf.off";
  3683. #endif
  3684. #endif
  3685. #endif
  3686.  
  3687. struct {    int offset,size; } load_offsets[MAX_FILES];
  3688. FILE *fd;
  3689.  
  3690. int opendatafile(char *datafile)
  3691.     {
  3692.     fd=fopen(datafile, "rb");
  3693.     if (fd==NULL)
  3694.         {
  3695.         puts("Can't find data file.");
  3696.         return(-1);
  3697.         }
  3698.     return(0);
  3699.     }
  3700.  
  3701. void closedatafile()
  3702.     {
  3703.     if (fd!=NULL)
  3704.         fclose(fd);
  3705.     fd=NULL;
  3706.     }
  3707.  
  3708. BYTE *readdatafile(int fileno, BYTE *address)
  3709. {
  3710.     BYTE *ptr;
  3711.     int seek_pos,file_size;
  3712.     seek_pos=load_offsets[fileno/8].offset;
  3713.     file_size=load_offsets[fileno/8].size;
  3714.     fseek(fd,seek_pos,SEEK_SET);
  3715.     if (address==NULL) 
  3716.         { if ((ptr=(BYTE *)mallocx(file_size*sizeof(BYTE)))==NULL) return(NULL); }
  3717.     else
  3718.         ptr=address;
  3719.     fread(ptr, sizeof(BYTE), file_size, fd);
  3720.     return(ptr);
  3721. }
  3722.  
  3723. BYTE *readfile(int fileno, BYTE *address)
  3724.     {
  3725.     BYTE *ptr;
  3726.     if ((ptr=readdatafile(fileno, address))==NULL)
  3727.         printf("Error loading data file %d\n",fileno);
  3728.     return (ptr);
  3729.     }
  3730.  
  3731. BYTE *readdatafilesection(int fileno, BYTE *address, int start_offset, int section_size)
  3732. {
  3733.     int seek_pos;
  3734.     seek_pos=load_offsets[fileno/8].offset+start_offset;
  3735.     fseek(fd,seek_pos,SEEK_SET);
  3736.     fread(address, sizeof(BYTE), section_size, fd);
  3737.     return (address);
  3738. }
  3739.  
  3740.  
  3741. BYTE *readfileblock(int fileno, int blockno, int blocks, BYTE *address)
  3742.     {
  3743.     int flen;
  3744.     BYTE *ptr;
  3745.     flen=load_offsets[fileno/8].size;
  3746.     if ((ptr=readdatafilesection(fileno,address+flen*blockno/blocks,flen*blockno/blocks,flen*(blockno+1)/blocks-flen*blockno/blocks))==NULL)
  3747.         printf("Error loading data file %d\n",fileno);
  3748.     return (ptr);
  3749.     }
  3750.  
  3751.  
  3752.  
  3753. #define FRM_WID 128
  3754. #define FRM_HGT 80
  3755. #define FRM_LEN (FRM_WID*FRM_HGT)
  3756. #define ANIM_SPACE 280000
  3757. //#define ANIM_SPACE 172000
  3758.  
  3759. char *anim_data;
  3760. int anim_start[]={0,10241,10241,10241,10241,10241,10241,10241,10241+91600,10241,10241+126777,10241,10241+127983};
  3761.  
  3762. char *buff_ptr;
  3763.  
  3764. typedef struct { int no,time;char *frmptr; } anim_info;
  3765. anim_info vidi;
  3766. int vidi_in,vidi_anim,vcount;
  3767.  
  3768.  
  3769. void
  3770. init_anim(anim_info &anim,int no)
  3771.     {
  3772.     int i;
  3773. //    char *buffp=buff_ptr;
  3774.     char *buffp=(char *)(maps[S_BM])+stadlist[setup.stadium].vmap;
  3775.     char *animp;
  3776.  
  3777.     anim.no=no;
  3778.     anim.time=count;
  3779.     animp=anim.frmptr=anim_data+anim_start[no];
  3780.  
  3781.     for (i=0;i<FRM_HGT;i++)
  3782.         {
  3783.         memcpy(buffp,animp,FRM_WID);
  3784.         buffp+=256;
  3785.         animp+=FRM_WID;
  3786.         }
  3787.     anim.frmptr=animp;
  3788.  
  3789.     }
  3790.  
  3791.  
  3792. void
  3793. stop_anim(anim_info &anim)
  3794.     {
  3795. #ifdef AMERICA
  3796.     readfile(COL_VR,(BYTE *)&pal[240*3]);
  3797. #else
  3798.     readfile(COL_VIDI,(BYTE *)&pal[240*3]);
  3799. #endif
  3800.     setpal();
  3801.     init_anim(anim,0);
  3802.     vidi_anim=0;
  3803.     }
  3804.  
  3805.  
  3806. void
  3807. do_anim(anim_info &anim)
  3808.     {
  3809.     int i,j,ttime,tval,tlen;
  3810.     int buffd=256-FRM_WID;
  3811. //    char *buffp=buff_ptr;
  3812.     char *buffp=(char *)(maps[S_BM])+stadlist[setup.stadium].vmap;
  3813.     char *animp;
  3814.  
  3815.     if (anim.no && (ttime=count)>anim.time+10)
  3816.         if (!*anim.frmptr)
  3817.              {
  3818.             if (vidi_anim==7||vidi_anim==9||vidi_anim==11)
  3819.                 vidi_anim++;
  3820.             init_anim(anim,vidi_anim);
  3821.              }
  3822.         else
  3823.             {
  3824.             if (--vcount<=0)
  3825.                 stop_anim(anim);
  3826.             else
  3827.                 {
  3828.                 animp=anim.frmptr;
  3829.                 anim.time=ttime;
  3830.  
  3831.                 tlen=FRM_WID;
  3832.                 while (tval=*animp++)
  3833.                     {
  3834.  
  3835.                     while (tlen<tval)    
  3836.                         {
  3837.                         tval-=tlen;
  3838.                         while (tlen--) (*buffp++) = (*animp++);
  3839.                         tlen=FRM_WID,buffp+=buffd;
  3840.                         }
  3841.                     tlen-=tval;
  3842.                     while (tval--) (*buffp++) = (*animp++);
  3843.  
  3844.                     tval=*animp++;
  3845.                     while (tlen<tval)    
  3846.                         {
  3847.                         tval-=tlen;
  3848.                         while (tlen--) buffp++;
  3849.                         tlen=FRM_WID,buffp+=buffd;
  3850.                         }
  3851.                     tlen-=tval;
  3852.                     while (tval--) buffp++;
  3853.                     }
  3854.  
  3855.                 anim.frmptr=animp;
  3856.                 }
  3857.               }
  3858.     }
  3859.  
  3860.  
  3861. int spool;
  3862.  
  3863. void
  3864. do_extra_time_anim(int sp)
  3865.     {
  3866. #ifdef FLOPPY
  3867.     return;
  3868. #else
  3869.     if (!setup.M8) return;
  3870.     vidi_anim=1;
  3871.     spool=sp;
  3872.     if (spool==10||vidi_in==1)
  3873.         {
  3874.         spool=0;
  3875.         readfile(COL_XET,(BYTE *)&pal[240*3]);
  3876.         setpal();
  3877.         vidi_in=1;
  3878.         vcount=200;
  3879.         init_anim(vidi,1);
  3880.         return;
  3881.         }
  3882.     readfileblock(FAP_XET,spool,10,(BYTE *)anim_data+10241);
  3883.     spool++;
  3884. #endif
  3885.     }
  3886.  
  3887. void
  3888. do_foul_anim(int sp)
  3889.     {
  3890. #ifdef FLOPPY
  3891.     return;
  3892. #else
  3893.     if (!setup.M8) return;
  3894.     vidi_anim=2;
  3895.     spool=sp;
  3896.     if (spool==10||vidi_in==2)
  3897.         {
  3898.         spool=0;
  3899.         readfile(COL_XFOU,(BYTE *)&pal[240*3]);
  3900.         setpal();
  3901.         vidi_in=2;
  3902.         vcount=100;
  3903.         init_anim(vidi,2);
  3904.         return;
  3905.         }
  3906.     readfileblock(FAP_XFOU,spool,10,(BYTE *)anim_data+10241);
  3907.     spool++;
  3908. #endif
  3909.     }
  3910.  
  3911. void
  3912. do_full_time_anim(int sp)
  3913.     {
  3914. #ifdef FLOPPY
  3915.     return;
  3916. #else
  3917.     if (!setup.M8) return;
  3918.     vidi_anim=3;
  3919.     spool=sp;
  3920.     if (spool==10||vidi_in==3)
  3921.         {
  3922.         spool=0;
  3923.         readfile(COL_XFT,(BYTE *)&pal[240*3]);
  3924.         setpal();
  3925.         vidi_in=3;
  3926.         vcount=200;
  3927.         init_anim(vidi,3);
  3928.         return;
  3929.         }
  3930.     readfileblock(FAP_XFT,spool,10,(BYTE *)anim_data+10241);
  3931.     spool++;
  3932. #endif
  3933.     }
  3934.  
  3935. void
  3936. do_half_time_anim(int sp)
  3937.     {
  3938. #ifdef FLOPPY
  3939.     return;
  3940. #else
  3941.     if (!setup.M8) return;
  3942.     vidi_anim=4;
  3943.     spool=sp;
  3944.     if (spool==10||vidi_in==4)
  3945.         {
  3946.         spool=0;
  3947.         readfile(COL_XHT,(BYTE *)&pal[240*3]);
  3948.         setpal();
  3949.         vidi_in=4;
  3950.         vcount=300;
  3951.         init_anim(vidi,4);
  3952.         return;
  3953.         }
  3954.     readfileblock(FAP_XHT,spool,10,(BYTE *)anim_data+10241);
  3955.     spool++;
  3956. #endif
  3957.     }
  3958.  
  3959. void
  3960. do_penalty_anim(int sp)
  3961.     {
  3962. #ifdef FLOPPY
  3963.     return;
  3964. #else
  3965.     if (!setup.M8) return;
  3966.     vidi_anim=5;
  3967.     spool=sp;
  3968.     if (spool==10||vidi_in==5)
  3969.         {
  3970.         spool=0;
  3971.         readfile(COL_XPEN,(BYTE *)&pal[240*3]);
  3972.         setpal();
  3973.         vidi_in=5;
  3974.         vcount=100;
  3975.         init_anim(vidi,5);
  3976.         return;
  3977.         }
  3978.     readfileblock(FAP_XPEN,spool,10,(BYTE *)anim_data+10241);
  3979.     spool++;
  3980. #endif
  3981.     }
  3982.  
  3983. /*
  3984. void
  3985. do_goal_anim(int sp)
  3986.     {
  3987.     if (!setup.M8) return;
  3988.     if (vidi_in!=6) readfile(FAP_XGOA,(BYTE *)anim_data+10241);
  3989.     readfile(COL_XGOA,(BYTE *)&pal[240*3]);
  3990.     setpal();
  3991.     vidi_anim=vidi_in=6;
  3992.     vcount=200;
  3993.     init_anim(vidi,6);
  3994.     }
  3995. */
  3996. void
  3997. do_goal_anim(int sp)
  3998.     {
  3999.     if (!setup.M8) return;
  4000.     vidi_anim=6;
  4001.     spool=sp;
  4002.     if (spool==10||vidi_in==6)
  4003.         {
  4004.         spool=0;
  4005. //#ifndef BBS
  4006. //        readfile(COL_BOOST,(BYTE *)&pal[240*3]);
  4007. //#else
  4008.         readfile(COL_XGOA,(BYTE *)&pal[240*3]);
  4009. //#endif
  4010.         setpal();
  4011.         vidi_in=6;
  4012.         vcount=200;
  4013.         init_anim(vidi,6);
  4014.         return;
  4015.         }
  4016. //#ifndef BBS
  4017. //    readfileblock(FAP_BOOST,spool,10,(BYTE *)anim_data+10241);
  4018. //#else
  4019.     readfileblock(FAP_XGOA,spool,10,(BYTE *)anim_data+10241);
  4020. //#endif
  4021.     spool++;
  4022.     }
  4023.  
  4024. void
  4025. do_win_f_anim(int sp)
  4026.     {
  4027. #ifdef FLOPPY
  4028.     return;
  4029. #else
  4030.     if (!setup.M8) return;
  4031.     vidi_anim=7;
  4032.     spool=sp;
  4033.     if (spool==10||vidi_in==7)
  4034.         {
  4035.         spool=0;
  4036.         readfile(COL_XWNF,(BYTE *)&pal[240*3]);
  4037.         setpal();
  4038.         vidi_in=7;
  4039.         vcount=100000;
  4040.         init_anim(vidi,7);
  4041.         return;
  4042.         }
  4043.     readfileblock(FAP_XWNF1,spool,10,(BYTE *)anim_data+10241);
  4044.     readfileblock(FAP_XWNF2,spool,10,(BYTE *)anim_data+10241+91600);
  4045.     spool++;
  4046. #endif
  4047.     }
  4048.  
  4049. void
  4050. do_win_g_anim(int sp)
  4051.     {
  4052. #ifdef FLOPPY
  4053.     return;
  4054. #else
  4055.     if (!setup.M8) return;
  4056.     vidi_anim=9;
  4057.     spool=sp;
  4058.     if (spool==10||vidi_in==9)
  4059.         {
  4060.         spool=0;
  4061.         readfile(COL_XWNG,(BYTE *)&pal[240*3]);
  4062.         setpal();
  4063.         vidi_in=9;
  4064.         vcount=100000;
  4065.         init_anim(vidi,9);
  4066.         return;
  4067.         }
  4068.     readfileblock(FAP_XWNG1,spool,10,(BYTE *)anim_data+10241);
  4069.     readfileblock(FAP_XWNG2,spool,10,(BYTE *)anim_data+10241+126777);
  4070.     spool++;
  4071. #endif
  4072.     }
  4073.  
  4074. void
  4075. do_win_s_anim(int sp)
  4076.     {
  4077. #ifdef FLOPPY
  4078.     return;
  4079. #else
  4080.     if (!setup.M8) return;
  4081.     vidi_anim=11;
  4082.     spool=sp;
  4083.     if (spool==10||vidi_in==11)
  4084.         {
  4085.         spool=0;
  4086.         readfile(COL_XWNS,(BYTE *)&pal[240*3]);
  4087.         setpal();
  4088.         vidi_in=11;
  4089.         vcount=100000;
  4090.         init_anim(vidi,11);
  4091.         return;
  4092.         }
  4093.     readfileblock(FAP_XWNS1,spool,10,(BYTE *)anim_data+10241);
  4094.     readfileblock(FAP_XWNS2,spool,10,(BYTE *)anim_data+10241+127983);
  4095.     spool++;
  4096. #endif
  4097.     }
  4098.  
  4099.  
  4100.  
  4101. /*********************/
  4102. /* IN-GAME FRONT END */
  4103.  
  4104. #if 0
  4105.  
  4106. texture_info     IngameTextureDEFN={NULL,256,256};
  4107. pseudo_info     IngamePseudoDEFN;
  4108.  
  4109. void InitSprites()
  4110.     {
  4111.     ReadDataOffsetFile(dataoffs);                 // Load data offset file. 
  4112.  
  4113.     Euro96_MemoryInitialise();                    // Resets all Euro memory handles.
  4114.  
  4115.     TextStringMemHandle  =                        // Set up memory handle.
  4116.         AllocateTextStringMemory();             // Allocate memory for text strings..
  4117.  
  4118.     process_script_file("ingame.spt");        // Reads script file and compiles relevent data for game.
  4119.  
  4120.     TexturePageMemHandle =                          // Set up memory handle.
  4121.         AllocateTexturePageMemory( 1,           // Specify number of texture pages to allocate.
  4122.             &IngameTextureDEFN );                  // Allocate memory for frontend texture pages.
  4123.  
  4124.     IngameTextureDEFN.page_start     = (BYTE *)TexturePages;    // Specify memory address used for texture pages.
  4125.     }
  4126.  
  4127. void LoadPage()
  4128.     {
  4129.     LoadTexturePage( BM_EXTRA1,                // Load texture page 1 into texture memory.
  4130.              datafile, 0,
  4131.              &IngameTextureDEFN );
  4132.     }
  4133.  
  4134.  
  4135.  
  4136. void UninitSprites()
  4137.     {
  4138.     DeAllocateMemory(TexturePageMemHandle);          // DeAllocates memory used previously for textures.
  4139.     DeAllocateMemory(TextStringMemHandle);            // DeAllocates memory used previously for text strings.
  4140.     }
  4141.  
  4142. #endif
  4143.  
  4144.  
  4145. #define NO_MENUS 24
  4146. buff_info menu_buff_l[NO_MENUS]=
  4147.     {
  4148.      {NULL, 320,64, 320,64, 0, 0, dumpnull},
  4149.      {NULL, 320,64, 320,64, 0, 0, dumpnull},
  4150.      {NULL, 320,64, 320,64, 0, 0, dumpnull},
  4151.      {NULL, 320,64, 224,64, 0, 0, dumpnull},
  4152.      {NULL, 320,64, 224,64, 0, 0, dumpnull},
  4153.      {NULL, 320,64, 192,64, 0, 0, dumpnull},
  4154.      {NULL, 320,64, 192,64, 0, 0, dumpnull},
  4155.      {NULL, 320,64, 192,64, 0, 0, dumpnull},
  4156.      {NULL, 320,64, 192,64, 0, 0, dumpnull},
  4157.      {NULL, 320,64, 192,64, 0, 0, dumpnull},
  4158.      {NULL, 320,64, 224,64, 0, 0, dumpnull},
  4159.      {NULL, 320,64, 320,64, 0, 0, dumpnull},
  4160.      {NULL, 320,128, 288,128, 0, 0, dumpnull},
  4161.      {NULL, 320,128, 288,128, 0, 0, dumpnull},
  4162.      {NULL, 320,128, 288,128, 0, 0, dumpnull},
  4163.      {NULL, 320,128, 288,128, 0, 0, dumpnull},
  4164.      {NULL, 320,128, 288,128, 0, 0, dumpnull},
  4165.      {NULL, 320,64, 320,64, 0, 0, dumpnull},
  4166.      {NULL, 320,128, 160,128, 0, 0, dumpnull},
  4167.      {NULL, 320,112, 160,112, 0, 0, dumpnull},
  4168.      {NULL, 320,128, 224,128, 0, 0, dumpnull},
  4169.      {NULL, 320,80, 288,80, 0, 0, dumpnull},
  4170. //     {NULL, 320,64, 224,64, 0, 0, dumpnull},
  4171.      {NULL, 320,64, 320,64, 0, 0, dumpnull},
  4172.      {NULL, 320,160, 256,160, 0, 0, dumpnull},
  4173.     };
  4174. buff_info menu_buff_h[NO_MENUS]=
  4175.     {
  4176.      {NULL, 640,128, 640,128, 0, 0, dumpnull},
  4177.      {NULL, 640,128, 640,128, 0, 0, dumpnull},
  4178.      {NULL, 640,128, 640,128, 0, 0, dumpnull},
  4179.      {NULL, 640,128, 448,128, 0, 0, dumpnull},
  4180.      {NULL, 640,128, 448,128, 0, 0, dumpnull},
  4181.      {NULL, 640,128, 384,128, 0, 0, dumpnull},
  4182.      {NULL, 640,128, 384,128, 0, 0, dumpnull},
  4183.      {NULL, 640,128, 384,128, 0, 0, dumpnull},
  4184.      {NULL, 640,128, 384,128, 0, 0, dumpnull},
  4185.      {NULL, 640,128, 384,128, 0, 0, dumpnull},
  4186.      {NULL, 640,128, 448,128, 0, 0, dumpnull},
  4187.      {NULL, 640,128, 640,128, 0, 0, dumpnull},
  4188.      {NULL, 640,256, 576,256, 0, 0, dumpnull},
  4189.      {NULL, 640,256, 576,256, 0, 0, dumpnull},
  4190.      {NULL, 640,256, 576,256, 0, 0, dumpnull},
  4191.      {NULL, 640,256, 576,256, 0, 0, dumpnull},
  4192.      {NULL, 640,256, 576,256, 0, 0, dumpnull},
  4193.      {NULL, 640,128, 640,128, 0, 0, dumpnull},
  4194.      {NULL, 640,256, 320,256, 0, 0, dumpnull},
  4195.      {NULL, 640,224, 320,224, 0, 0, dumpnull},
  4196.      {NULL, 640,256, 448,256, 0, 0, dumpnull},
  4197.      {NULL, 640,160, 576,160, 0, 0, dumpnull},
  4198. //     {NULL, 640,128, 448,128, 0, 0, dumpnull},
  4199.      {NULL, 640,128, 640,128, 0, 0, dumpnull},
  4200.      {NULL, 640,320, 512,320, 0, 0, dumpnull},
  4201.     };
  4202.  
  4203. struct mtime {
  4204.       unsigned short min;
  4205.     float secs;
  4206. };
  4207.  
  4208. extern mtime match_time;
  4209. extern int team_a_goals;
  4210. extern int team_b_goals;
  4211.  
  4212. extern goal_table    goals[];
  4213. extern team_info    game_data[2];
  4214. //extern match_data match_info;
  4215. extern match_player teams[22];
  4216.  
  4217. float slco;
  4218. int slide,oslide,mcount,menu,mhgt,rdmenu;
  4219. int mdata1,mdata2,mdata3;
  4220.  
  4221. void
  4222. draw_sprite(buff_info *buff,int sprite_no,int x,int y,BYTE col)
  4223.     {
  4224.     int sd;
  4225.     if (scrmode3DB>=0)
  4226.         {
  4227.             x+=menx3DB;
  4228.             y+=meny3DB;
  4229.             curpts3DB->x=x<<16;
  4230.             curpts3DB->y=((render_buff.clip_hgtl-(y+spr_data[sprite_no].hgt))<<16);
  4231.             if (curpts3DB->y<0x10000)
  4232.                 {
  4233.                 sd=curpts3DB->y-0x10000;
  4234.                 curpts3DB->y=0x10000;
  4235.                 }
  4236.             else
  4237.                 sd=0;
  4238.             curpts3DB++;
  4239.             curpts3DB->x=((x+spr_data[sprite_no].wid)<<16);
  4240.             curpts3DB->y=(render_buff.clip_hgtl-y)<<16;
  4241.             if (curpts3DB->y<0) {curpts3DB--;return;}
  4242.             curpts3DB++;
  4243.             curtex3DB++;
  4244.             (curtex3DB-1)->s=0x1000000+((spr_data[sprite_no].x)<<16);
  4245.             curtex3DB->t=0x2000000+(spr_data[sprite_no].page<<24)+((spr_data[sprite_no].y)<<16);
  4246.             curtex3DB->s=(curtex3DB-1)->s+((spr_data[sprite_no].wid+1)<<16);
  4247.             (curtex3DB-1)->t=curtex3DB->t+((spr_data[sprite_no].hgt+1)<<16)+sd;
  4248.             curtex3DB++;
  4249.         }
  4250.     else
  4251.         {
  4252.         BYTE *spt=buff->buff_start+y*buff->buff_wid+x;
  4253.         BYTE *spd=maps[X_BM+spr_data[sprite_no].page]+spr_data[sprite_no].y*256+spr_data[sprite_no].x;
  4254.         int w=min(spr_data[sprite_no].wid,buff->clip_wid-x);
  4255.         int h=min(spr_data[sprite_no].hgt,buff->clip_hgt-y);
  4256.         int ts=buff->buff_wid-w;
  4257.         int ds=256-w;
  4258.         int i,j;
  4259.         BYTE c;
  4260.         if (w<0||h<0) return;
  4261.         for (i=0;i<h;i++)
  4262.             {
  4263.             for (j=0;j<w;j++)
  4264.                 {
  4265.                 c=*spd++;
  4266.                 if (c) if (!--c) *spt=col; else *spt=c;
  4267.                 spt++;
  4268.                 }
  4269.             spt+=ts;
  4270.             spd+=ds;
  4271.             }
  4272.         }
  4273.     }
  4274.  
  4275. void
  4276. draw_sprite_d(buff_info *buff,int sprite_no,int x,int y,BYTE col)
  4277.     {
  4278.     int sd;
  4279.     if (scrmode3DB>=0)
  4280.         {
  4281.             x+=menx3DB;
  4282.             y+=meny3DB;
  4283.             curpts3DB->x=x<<16;
  4284.             curpts3DB->y=(render_buff.clip_hgtl-(y+(spr_data[sprite_no].hgt<<1)))<<16;
  4285.             if (curpts3DB->y<0x10000)
  4286.                 {
  4287.                 sd=curpts3DB->y-0x10000;
  4288.                 curpts3DB->y=0x10000;
  4289.                 }
  4290.             else
  4291.                 sd=0;
  4292.             curpts3DB++;
  4293.             curpts3DB->x=(x+(spr_data[sprite_no].wid<<1))<<16;
  4294.             curpts3DB->y=(render_buff.clip_hgtl-y)<<16;
  4295.             if (curpts3DB->y<0) {curpts3DB--;return;}
  4296.             curpts3DB++;
  4297.             curtex3DB++;
  4298.             (curtex3DB-1)->s=0x1000000+((spr_data[sprite_no].x)<<16);
  4299.             curtex3DB->t=0x2000000+(spr_data[sprite_no].page<<24)+((spr_data[sprite_no].y)<<16);
  4300.             curtex3DB->s=(curtex3DB-1)->s+((spr_data[sprite_no].wid+1)<<16);
  4301.             (curtex3DB-1)->t=curtex3DB->t+((spr_data[sprite_no].hgt+1)<<16)+sd;
  4302.             curtex3DB++;
  4303.         }
  4304.     else
  4305.         {                         
  4306.         BYTE *spt=buff->buff_start+y*buff->buff_wid+x;
  4307.         BYTE *spd=maps[X_BM+spr_data[sprite_no].page]+spr_data[sprite_no].y*256+spr_data[sprite_no].x;
  4308.         int w=min(spr_data[sprite_no].wid,buff->clip_wid-x);
  4309.         int h=min(spr_data[sprite_no].hgt,buff->clip_hgt-y);
  4310.         int ts=buff->buff_wid-(w<<1);
  4311.         int ds=256-w;
  4312.         int i,j;
  4313.         BYTE c;
  4314.         if (w<0||h<0) return;
  4315.         for (i=0;i<h;i++)
  4316.             {
  4317.             for (j=0;j<w;j++)
  4318.                 {
  4319.                 c=*spd++;
  4320.                 if (c) if (!--c) *spt=col; else *spt=c;
  4321.                 spt++;
  4322.                 if (c) if (!--c) *spt=col; else *spt=c;
  4323.                 spt++;
  4324.                 }
  4325.             spt+=ts;
  4326.             spd-=w;
  4327.             for (j=0;j<w;j++)
  4328.                 {
  4329.                 c=*spd++;
  4330.                 if (c) if (!--c) *spt=col; else *spt=c;
  4331.                 spt++;
  4332.                 if (c) if (!--c) *spt=col; else *spt=c;
  4333.                 spt++;
  4334.                 }
  4335.             spt+=ts;
  4336.             spd+=ds;
  4337.             }
  4338.         }
  4339.     }
  4340.  
  4341. void
  4342. draw_sprite_s(buff_info *buff,int sprite_no,int x,int y,BYTE col)
  4343.     {
  4344.     int sd;
  4345.     if (scrmode3DB>=0)
  4346.         {
  4347.             x+=menx3DB;
  4348.             y+=meny3DB;
  4349.             curpts3DB->x=x<<16;
  4350.             curpts3DB->y=(render_buff.clip_hgtl-(y+spr_data[sprite_no].hgt))<<16;
  4351.             if (curpts3DB->y<0x10000)
  4352.                 {
  4353.                 sd=curpts3DB->y-0x10000;
  4354.                 curpts3DB->y=0x10000;
  4355.                 }
  4356.             else
  4357.                 sd=0;
  4358.             curpts3DB++;
  4359.             curpts3DB->x=(x+spr_data[sprite_no].wid)<<16;
  4360.             curpts3DB->y=(render_buff.clip_hgtl-y)<<16;
  4361.             if (curpts3DB->y<0) {curpts3DB--;return;}
  4362.             curpts3DB++;
  4363.             curtex3DB++;
  4364.             (curtex3DB-1)->s=0x1000000+((spr_data[sprite_no].x)<<16);
  4365.             curtex3DB->t=0x2000000+(spr_data[sprite_no].page<<24)+((spr_data[sprite_no].y)<<16);
  4366.             curtex3DB->s=(curtex3DB-1)->s+((spr_data[sprite_no].wid+1)<<16);
  4367.             (curtex3DB-1)->t=curtex3DB->t+((spr_data[sprite_no].hgt+1)<<16)+sd;
  4368.             curtex3DB++;
  4369.         }
  4370.     else
  4371.         {
  4372.         BYTE *spt=buff->buff_start+y*buff->buff_wid+x;
  4373.         BYTE *spd=maps[X_BM+spr_data[sprite_no].page]+spr_data[sprite_no].y*256+spr_data[sprite_no].x;
  4374.         int w=min(spr_data[sprite_no].wid,buff->clip_wid-x);
  4375.         int h=min(spr_data[sprite_no].hgt,buff->clip_hgt-y);
  4376.         int ts=buff->buff_wid-w;
  4377.         int ds=256-w;
  4378.         int i,j;
  4379.         BYTE c;
  4380.         if (w<0||h<0) return;
  4381.         for (i=0;i<h;i++)
  4382.             {
  4383.             for (j=0;j<w;j++)
  4384.                 {
  4385.                 c=*spd++;
  4386.                 if (--c) *spt=c;
  4387.                 spt++;
  4388.                 }
  4389.             spt+=ts;
  4390.             spd+=ds;
  4391.             }
  4392.         }
  4393.     }
  4394.  
  4395. void
  4396. draw_sprite_vf(buff_info *buff,int sprite_no,int x,int y,BYTE col)
  4397.     {
  4398.     int sd;
  4399.     if (scrmode3DB>=0)
  4400.         {
  4401.             x+=menx3DB;
  4402.             y+=meny3DB;
  4403.             curpts3DB->x=x<<16;
  4404.             curpts3DB->y=(render_buff.clip_hgtl-(y+spr_data[sprite_no].hgt))<<16;
  4405.             if (curpts3DB->y<0x10000)
  4406.                 {
  4407.                 sd=curpts3DB->y-0x10000;
  4408.                 curpts3DB->y=0x10000;
  4409.                 }
  4410.             else
  4411.                 sd=0;
  4412.             curpts3DB++;
  4413.             curpts3DB->x=(x+spr_data[sprite_no].wid)<<16;
  4414.             curpts3DB->y=(render_buff.clip_hgtl-y)<<16;
  4415.             if (curpts3DB->y<0) {curpts3DB--;return;}
  4416.             curpts3DB++;
  4417.             curtex3DB++;
  4418.             (curtex3DB-1)->s=0x1000000+((spr_data[sprite_no].x)<<16);
  4419.             (curtex3DB-1)->t=0x2000000+(spr_data[sprite_no].page<<24)+((spr_data[sprite_no].y-1)<<16)-sd;
  4420.             curtex3DB->s=(curtex3DB-1)->s+((spr_data[sprite_no].wid+1)<<16);
  4421.             curtex3DB->t=(curtex3DB-1)->t+((spr_data[sprite_no].hgt)<<16)+sd;
  4422.             curtex3DB++;
  4423.         }
  4424.     else
  4425.         {
  4426.         BYTE *spt=buff->buff_start+y*buff->buff_wid+x;
  4427.         BYTE *spd=maps[X_BM+spr_data[sprite_no].page]+spr_data[sprite_no].y*256+spr_data[sprite_no].x+(spr_data[sprite_no].hgt-1)*256;
  4428.         int w=min(spr_data[sprite_no].wid,buff->clip_wid-x);
  4429.         int h=min(spr_data[sprite_no].hgt,buff->clip_hgt-y);
  4430.         int ts=buff->buff_wid-w;
  4431.         int ds=256+w;
  4432.         int i,j;
  4433.         BYTE c;
  4434.         for (i=0;i<h;i++)
  4435.             {
  4436.             for (j=0;j<w;j++)
  4437.                 {
  4438.                 c=*spd++;
  4439.                 if (c) if (!--c) *spt=col; else *spt=c;
  4440.                 spt++;
  4441.                 }
  4442.             spt+=ts;
  4443.             spd-=ds;
  4444.             }
  4445.         }
  4446.     }
  4447.  
  4448. void
  4449. draw_sprite_r(buff_info *buff,int sprite_no,int x,int y,BYTE col)
  4450.     {
  4451.     int sd;
  4452.     if (scrmode3DB>=0)
  4453.         {
  4454.             x+=menx3DB;
  4455.             y+=meny3DB;
  4456.             curpts3DB->x=(x+spr_data[sprite_no].wid)<<16;
  4457.             curpts3DB->y=(render_buff.clip_hgtl-(y+spr_data[sprite_no].hgt))<<16;
  4458.             curpts3DB++;
  4459.             curpts3DB->x=x<<16;
  4460.             curpts3DB->y=(render_buff.clip_hgtl-y)<<16;
  4461.             curpts3DB++;
  4462.             curtex3DB++;
  4463.             (curtex3DB-1)->s=0x1000000+((spr_data[sprite_no].x)<<16);
  4464.             curtex3DB->t=0x2000000+(spr_data[sprite_no].page<<24)+((spr_data[sprite_no].y+1)<<16);
  4465.             curtex3DB->s=(curtex3DB-1)->s+((spr_data[sprite_no].wid+1)<<16);
  4466.             (curtex3DB-1)->t=curtex3DB->t+((spr_data[sprite_no].hgt+1)<<16);
  4467.             curtex3DB++;
  4468.         }
  4469.     else
  4470.         {
  4471.         BYTE *spt=buff->buff_start+y*buff->buff_wid+x;
  4472.         BYTE *spd=maps[X_BM+spr_data[sprite_no].page]+spr_data[sprite_no].y*256+spr_data[sprite_no].x;
  4473.         BYTE *tspd;
  4474.         int w=min(spr_data[sprite_no].wid,buff->clip_wid-x);
  4475.         int h=min(spr_data[sprite_no].hgt,buff->clip_hgt-y);
  4476.         int ts=buff->buff_wid-w;
  4477.         int ds=256-w;
  4478.         int i,j;
  4479.         BYTE c;
  4480.         if (w<0||h<0) return;
  4481.         for (i=0;i<h;i++)
  4482.             {
  4483.             tspd=spd;
  4484.             for (j=0;j<w;j++)
  4485.                 {
  4486.                 c=*spd;
  4487.                 spd+=256;
  4488.                 if (c) if (!--c) *spt=col; else *spt=c;
  4489.                 spt++;
  4490.                 }
  4491.             spt+=ts;
  4492.             spd=tspd+1;
  4493.             }
  4494.         }
  4495.     }
  4496.  
  4497. void
  4498. draw_sprite_hf(buff_info *buff,int sprite_no,int x,int y,BYTE col)
  4499.     {
  4500.     int sd;
  4501.     if (scrmode3DB>=0)
  4502.         {
  4503.             x+=menx3DB;
  4504.             y+=meny3DB;
  4505.             curpts3DB->x=x<<16;
  4506.             curpts3DB->y=(render_buff.clip_hgtl-(y+spr_data[sprite_no].hgt))<<16;
  4507.             if (curpts3DB->y<0x10000)
  4508.                 {
  4509.                 sd=curpts3DB->y-0x10000;
  4510.                 curpts3DB->y=0x10000;
  4511.                 }
  4512.             else
  4513.                 sd=0;
  4514.             curpts3DB++;
  4515.             curpts3DB->x=(x+spr_data[sprite_no].wid)<<16;
  4516.             curpts3DB->y=(render_buff.clip_hgtl-y)<<16;
  4517.             if (curpts3DB->y<0) {curpts3DB--;return;}
  4518.             curpts3DB++;
  4519.             curtex3DB++;
  4520.             curtex3DB->s=0x1000000+((spr_data[sprite_no].x-1)<<16);
  4521.             curtex3DB->t=0x2000000+(spr_data[sprite_no].page<<24)+((spr_data[sprite_no].y)<<16);
  4522.             (curtex3DB-1)->s=curtex3DB->s+((spr_data[sprite_no].wid)<<16);
  4523.             (curtex3DB-1)->t=curtex3DB->t+((spr_data[sprite_no].hgt+1)<<16)+sd;
  4524.             curtex3DB++;
  4525.         }
  4526.     else
  4527.         {
  4528.         BYTE *spt=buff->buff_start+y*buff->buff_wid+x;
  4529.         BYTE *spd=maps[X_BM+spr_data[sprite_no].page]+spr_data[sprite_no].y*256+spr_data[sprite_no].x+spr_data[sprite_no].wid-1;
  4530.         int w=min(spr_data[sprite_no].wid,buff->clip_wid-x);
  4531.         int h=min(spr_data[sprite_no].hgt,buff->clip_hgt-y);
  4532.         int ts=buff->buff_wid-w;
  4533.         int ds=256+w;
  4534.         int i,j;
  4535.         BYTE c;
  4536.         for (i=0;i<h;i++)
  4537.             {
  4538.             for (j=0;j<w;j++)
  4539.                 {
  4540.                 c=*spd--;
  4541.                 if (c) if (!--c) *spt=col; else *spt=c;
  4542.                 spt++;
  4543.                 }
  4544.             spt+=ts;
  4545.             spd+=ds;
  4546.             }
  4547.         }
  4548.     }
  4549.  
  4550. void
  4551. draw_sprite_vhf(buff_info *buff,int sprite_no,int x,int y,BYTE col)
  4552.     {
  4553.     int sd;
  4554.     if (scrmode3DB>=0)
  4555.         {
  4556.             x+=menx3DB;
  4557.             y+=meny3DB;
  4558.             curpts3DB->x=x<<16;
  4559.             curpts3DB->y=(render_buff.clip_hgtl-(y+spr_data[sprite_no].hgt))<<16;
  4560.             if (curpts3DB->y<0x10000)
  4561.                 {
  4562.                 sd=curpts3DB->y-0x10000;
  4563.                 curpts3DB->y=0x10000;
  4564.                 }
  4565.             else
  4566.                 sd=0;
  4567.             curpts3DB++;
  4568.             curpts3DB->x=(x+spr_data[sprite_no].wid)<<16;
  4569.             curpts3DB->y=(render_buff.clip_hgtl-y)<<16;
  4570.             if (curpts3DB->y<0) {curpts3DB--;return;}
  4571.             curpts3DB++;
  4572.             curtex3DB++;
  4573.             curtex3DB->s=0x1000000+((spr_data[sprite_no].x-1)<<16);
  4574.             (curtex3DB-1)->t=0x2000000+(spr_data[sprite_no].page<<24)+((spr_data[sprite_no].y-1)<<16)-sd;
  4575.             (curtex3DB-1)->s=curtex3DB->s+((spr_data[sprite_no].wid)<<16);
  4576.             curtex3DB->t=(curtex3DB-1)->t+((spr_data[sprite_no].hgt)<<16)+sd;
  4577.             curtex3DB++;
  4578.         }
  4579.     else
  4580.         {
  4581.         BYTE *spt=buff->buff_start+y*buff->buff_wid+x;
  4582.         BYTE *spd=maps[X_BM+spr_data[sprite_no].page]+spr_data[sprite_no].y*256+spr_data[sprite_no].x+(spr_data[sprite_no].hgt-1)*256+spr_data[sprite_no].wid-1;
  4583.         int w=min(spr_data[sprite_no].wid,buff->clip_wid-x);
  4584.         int h=min(spr_data[sprite_no].hgt,buff->clip_hgt-y);
  4585.         int ts=buff->buff_wid-w;
  4586.         int ds=256-w;
  4587.         int i,j;
  4588.         BYTE c;
  4589.         for (i=0;i<h;i++)
  4590.             {
  4591.             for (j=0;j<w;j++)
  4592.                 {
  4593.                 c=*spd--;
  4594.                 if (c) if (!--c) *spt=col; else *spt=c;
  4595.                 spt++;
  4596.                 }
  4597.             spt+=ts;
  4598.             spd-=ds;
  4599.             }
  4600.         }
  4601.     }
  4602.  
  4603. int
  4604. string_len(int font_no,char *string)
  4605.     {
  4606.     BYTE c;
  4607.     int len=0;
  4608.     while (c=*string++)
  4609.         {
  4610.         if (c==' ') c=';';
  4611.         if (c=='.') c='@';
  4612.         if (c==',') c='?';
  4613.         if (c=='>')    c='A';
  4614.         if (c>='a'&&c<='z') c-=32;
  4615.         if (c=='O') c='0';
  4616.         if (c=='&') c='O';
  4617.         c-=48;
  4618.         len+=font_data[font_no].prp[c]+1;
  4619.         }
  4620.     return(len);
  4621.     }
  4622.  
  4623. int
  4624. draw_string(buff_info *buff,int font_no,int x,int y,char *string,BYTE col,short just)
  4625.     {
  4626.     BYTE c,ec;
  4627.     int len;
  4628.     len=string_len(font_no,string);
  4629.     switch (just)
  4630.         {
  4631.         case 1:
  4632.             x-=len;
  4633.             break;
  4634.         case 2:
  4635.             x-=len>>1;
  4636.             break;
  4637.         }
  4638.     while (c=*string++)
  4639.         {
  4640.         if (c==' ') c=';';
  4641.         if (c=='.') c='@';
  4642.         if (c==',') c='?';
  4643.         if (c=='>')
  4644.             {
  4645.             c-=48;
  4646.             ec=c+font_data[font_no].off;
  4647.             spr_data[0].page=font_data[font_no].page;
  4648.             spr_data[0].x=font_data[font_no].x+font_data[font_no].wid*(ec%font_data[font_no].n);
  4649.             spr_data[0].y=font_data[font_no].y+font_data[font_no].hgt*(ec/font_data[font_no].n);
  4650.             spr_data[0].wid=font_data[font_no].prp[c];
  4651.             spr_data[0].hgt=font_data[font_no].hgt;
  4652.             draw_sprite(buff,0,x,y-font_data[font_no].hgt,col);
  4653.             c='A';
  4654.             }
  4655.         if (c>='a'&&c<='z') c-=32;
  4656.         if (c=='O') c='0';
  4657.         if (c=='&') c='O';
  4658.         c-=48;
  4659.         ec=c+font_data[font_no].off;
  4660.         spr_data[0].page=font_data[font_no].page;
  4661.         spr_data[0].x=font_data[font_no].x+font_data[font_no].wid*(ec%font_data[font_no].n);
  4662.         spr_data[0].y=font_data[font_no].y+font_data[font_no].hgt*(ec/font_data[font_no].n);
  4663.         spr_data[0].wid=font_data[font_no].prp[c];
  4664.         spr_data[0].hgt=font_data[font_no].hgt;
  4665.         draw_sprite(buff,0,x,y,col);
  4666.         x+=font_data[font_no].prp[c]+1;
  4667.         }
  4668.         return (len);
  4669.     }
  4670.  
  4671. void rectshadow3DB(buff_info *buff,int x,int y,int w,int h)
  4672.     {
  4673.     int tx,tw,i,j,c,d;
  4674.     while (h>=62)
  4675.         {
  4676.         tx=x;
  4677.         tw=w;
  4678.         while (w>=64)
  4679.             {
  4680.             draw_sprite(buff,93,x,y,0);
  4681.             x+=64;
  4682.             w-=64;
  4683.             }
  4684.         for (i=0,c=32;i<5;i++,c>>=1)
  4685.             if (w&c)
  4686.                 {
  4687.                 draw_sprite(buff,94+i,x,y,0);
  4688.                 x+=c;
  4689.                 }
  4690.         x=tx;
  4691.         w=tw;
  4692.         h-=62;
  4693.         y+=62;
  4694.         }
  4695.     for (i=0,c=32;i<5;i++,c>>=1)
  4696.         if (h&c)
  4697.             {
  4698.             tx=x;
  4699.             tw=w;
  4700.             while (w>=64)
  4701.                 {
  4702.                 draw_sprite(buff,99+i*6,x,y,0);
  4703.                 x+=64;
  4704.                 w-=64;
  4705.                 }
  4706.             for (j=0,d=32;j<5;j++,d>>=1)
  4707.                 if (w&d)
  4708.                     {
  4709.                     draw_sprite(buff,100+i*6+j,x,y,0);
  4710.                     x+=d;
  4711.                     }
  4712.             x=tx;
  4713.             w=tw;
  4714.             h-=c;
  4715.             y+=c;
  4716.             }
  4717.     }
  4718.  
  4719.  
  4720. void
  4721. draw_menu_box(buff_info *buff)
  4722.     {
  4723.     short f,w,wd,hd;
  4724.     BYTE *col=filters[0];
  4725.     BYTE *sc;
  4726.     if (scrmode!=0x13)
  4727.         {
  4728.         if ((hd=min(buff->buff_hgt-(19+32)*2,buff->clip_hgt-19-32))>0)
  4729.             if (scrmode3DB<0)
  4730.                 {
  4731.                 wd=buff->clip_wid-20*2;
  4732.                 sc=buff->buff_start+(19+32)*buff->buff_wid+20;
  4733.                 for (f=hd;f;f--)
  4734.                     {
  4735.                     w=wd;
  4736.                     do {*sc=col[*sc];sc++;} while (--w);
  4737.                     sc+=render_buff.buff_wid-wd;
  4738.                     }
  4739.                 }
  4740.             else
  4741.                 rectshadow3DB(buff,20,19+32,buff->clip_wid-20*2,hd);
  4742.         draw_sprite(buff,21,11,10+32,0);
  4743.         draw_sprite_hf(buff,21,buff->clip_wid-32,10+32,0);
  4744.         draw_sprite_vhf(buff,21,buff->clip_wid-32,buff->buff_hgt-32-32,0);
  4745.         draw_sprite_vf(buff,21,11,buff->buff_hgt-32-32,0);
  4746.         for (f=32;f<buff->clip_wid-32;f+=32)
  4747.             {
  4748.             draw_sprite(buff,22,f,10+32,0);
  4749.             draw_sprite(buff,22,f,buff->buff_hgt-19-32,0);
  4750.             }
  4751.         for (f=32+32;f<buff->buff_hgt-32-32;f+=32)
  4752.             {
  4753.             draw_sprite(buff,23,11,f,0);
  4754.             draw_sprite(buff,23,buff->clip_wid-20,f,0);
  4755.             }
  4756.         }
  4757.     else
  4758.         {
  4759.         if ((hd=min(buff->buff_hgt-(10+16)*2,buff->clip_hgt-10-16))>0)
  4760.             if (scrmode3DB<0)
  4761.                 {
  4762.                 wd=buff->clip_wid-10*2;
  4763.                 sc=buff->buff_start+(10+16)*buff->buff_wid+10;
  4764.                 for (f=hd;f;f--)
  4765.                     {
  4766.                     w=wd;
  4767.                     do {*sc=col[*sc];sc++;} while (--w);
  4768.                     sc+=render_buff.buff_wid-wd;
  4769.                     }
  4770.                 }
  4771.             else
  4772.                 rectshadow3DB(buff,10,10+16,buff->clip_wid-10*2,hd);
  4773.         draw_sprite(buff,32,5,5+16,0);
  4774.         draw_sprite_hf(buff,32,buff->clip_wid-16,5+16,0);
  4775.         draw_sprite_vhf(buff,32,buff->clip_wid-16,buff->buff_hgt-16-16,0);
  4776.         draw_sprite_vf(buff,32,5,buff->buff_hgt-16-16,0);
  4777.         for (f=16;f<buff->clip_wid-16;f+=32)
  4778.             {
  4779.             draw_sprite(buff,33,f,5+16,0);
  4780.             draw_sprite(buff,33,f,buff->buff_hgt-10-16,0);
  4781.             }
  4782.         for (f=16+16;f<buff->buff_hgt-32-16;f+=32)
  4783.             {
  4784.             draw_sprite(buff,34,5,f,0);
  4785.             draw_sprite(buff,34,buff->clip_wid-10,f,0);
  4786.             }
  4787.         if (f<buff->buff_hgt-16-16)
  4788.             {
  4789.             draw_sprite(buff,83,5,f,0);
  4790.             draw_sprite(buff,83,buff->clip_wid-10,f,0);
  4791.             }
  4792.         }
  4793.     }
  4794.  
  4795.  
  4796. void 
  4797. goal_menu(buff_info *buff, int team, int player, int time)
  4798.     {
  4799.     int shirt;
  4800.     if (!team)
  4801.         shirt=ppt[player+((match_half&1)?11:0)].number-1;
  4802.     else
  4803.         shirt=ppt[player+((match_half&1)?0:11)].number-1;
  4804.     draw_menu_box(buff);
  4805.     if (scrmode==0x13)
  4806.         {
  4807.         draw_sprite(buff,30+team,10,11,0);
  4808.         draw_sprite(buff,2+shirt,16,21,0);
  4809.         draw_string(buff,0,160,30, GetTEXT( GLSC_TEXT ) ,207,1);
  4810.         if (!team)
  4811.             draw_string(buff,0,160,30,
  4812.                     GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  4813.                     31,0);
  4814.  
  4815.         else
  4816.             draw_string(buff,0,160,30,
  4817.                     GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  4818.                     31,0);
  4819.  
  4820.         draw_sprite(buff,40,278,18,0);
  4821.         }
  4822.     else
  4823.         {
  4824.         draw_sprite(buff,19+team,20,24,0);
  4825.         draw_string(buff,2,320,56, GetTEXT( GLSC_TEXT ),207,1);
  4826.  
  4827.         if (!team)
  4828.             {
  4829.             draw_sprite_s(buff,53+shirt,42,51,0);
  4830.             draw_string(buff,2,320,56,
  4831.                 GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  4832.                 31,0);
  4833.             }
  4834.         else
  4835.             {
  4836.             draw_sprite_s(buff,68+shirt,42,51,0);
  4837.             draw_string(buff,2,320,56,
  4838.                 GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  4839.                 31,0);
  4840.             }
  4841.         draw_sprite(buff,29,556,38,0);
  4842.         }
  4843.     }
  4844.  
  4845. void 
  4846. booked_menu(buff_info *buff, int team, int player)
  4847.     {
  4848.     int shirt;
  4849.     if (!team)
  4850.         shirt=ppt[player+((match_half&1)?11:0)].number-1;
  4851.     else
  4852.         shirt=ppt[player+((match_half&1)?0:11)].number-1;
  4853.     draw_menu_box(buff);
  4854.     if (scrmode==0x13)
  4855.         {
  4856.         draw_sprite(buff,30+team,10,11,0);
  4857.         draw_sprite(buff,2+shirt,16,21,0);
  4858.         draw_string(buff,0,160,30,GetTEXT( YLCD_TEXT ),157,1);
  4859.         if (!team)
  4860.             draw_string(buff,0,160,30,
  4861.                 GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  4862.                 31,0);
  4863.         else
  4864.             draw_string(buff,0,160,30,
  4865.                 GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  4866.                 31,0);
  4867.         draw_sprite(buff,51,276,9,0);
  4868.         draw_sprite(buff,52,276,11,0);
  4869.         }
  4870.     else
  4871.         {
  4872.         draw_sprite(buff,19+team,20,24,0);
  4873.         draw_string(buff,2,320,56,GetTEXT( YLCD_TEXT ),157,1);
  4874.         if (!team)
  4875.             {
  4876.             draw_sprite_s(buff,53+shirt,42,51,0);
  4877.             draw_string(buff,2,320,56,
  4878.                 GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  4879.                 31,0);
  4880.             }
  4881.         else
  4882.             {
  4883.             draw_sprite_s(buff,68+shirt,42,51,0);
  4884.             draw_string(buff,2,320,56,
  4885.                 GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  4886.                 31,0);
  4887.             }
  4888.         draw_sprite(buff,45,552,18,0);
  4889.         draw_sprite(buff,46,552,24,0);
  4890.         }
  4891.     }
  4892.  
  4893. void 
  4894. off_menu(buff_info *buff, int team, int player)
  4895.     {
  4896.     int shirt;
  4897.     if (!team)
  4898.         shirt=ppt[player+((match_half&1)?11:0)].number-1;
  4899.     else
  4900.         shirt=ppt[player+((match_half&1)?0:11)].number-1;
  4901.     draw_menu_box(buff);
  4902.     if (scrmode==0x13)
  4903.         {
  4904.         draw_sprite(buff,30+team,10,11,0);
  4905.         draw_sprite(buff,2+shirt,16,21,0);
  4906.         draw_string(buff,0,160,30,GetTEXT( RDCD_TEXT ),127,1);
  4907.         if (!team)
  4908.             draw_string(buff,0,160,30,
  4909.                 GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  4910.                 31,0);
  4911.         else
  4912.             draw_string(buff,0,160,30,
  4913.                 GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  4914.                 31,0);
  4915.         draw_sprite(buff,50,276,9,0);
  4916.         draw_sprite(buff,52,276,11,0);
  4917.         }
  4918.     else
  4919.         {
  4920.         draw_sprite(buff,19+team,20,24,0);
  4921.         draw_string(buff,2,320,56,GetTEXT( RDCD_TEXT ),127,1);
  4922.         if (!team)
  4923.             {
  4924.             draw_sprite_s(buff,53+shirt,42,51,0);
  4925.             draw_string(buff,2,320,56,
  4926.                 GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  4927.                 31,0);
  4928.             }
  4929.         else                            
  4930.             {
  4931.             draw_sprite_s(buff,68+shirt,42,51,0);
  4932.             draw_string(buff,2,320,56,
  4933.                 GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  4934.                 31,0);
  4935.             }
  4936.         draw_sprite(buff,44,552,18,0);
  4937.         draw_sprite(buff,46,552,24,0);
  4938.         }
  4939.     }
  4940.  
  4941. void 
  4942. direct_menu(buff_info *buff, int team)
  4943.     {
  4944.     draw_menu_box(buff);
  4945.     if (scrmode==0x13)
  4946.         {
  4947.         draw_sprite(buff,30+team,10,11,0);
  4948.         draw_string(buff,0,112,30,GetTEXT( DRKC_TEXT ),31,2);
  4949.         draw_sprite(buff,52,188,11,0);
  4950.         }
  4951.     else
  4952.         {
  4953.         draw_sprite(buff,19+team,20,24,0);
  4954.         draw_string(buff,2,224,56,GetTEXT( DRKC_TEXT ),31,2);
  4955.         draw_sprite(buff,46,376,24,0);
  4956.         }
  4957.     }
  4958.  
  4959. void 
  4960. indirect_menu(buff_info *buff, int team)
  4961.     {
  4962.     draw_menu_box(buff);
  4963.     if (scrmode==0x13)
  4964.         {
  4965.         draw_sprite(buff,30+team,10,11,0);
  4966.         draw_string(buff,0,112,30,GetTEXT( IDKC_TEXT ),31,2);
  4967.         draw_sprite(buff,52,188,11,0);
  4968.         }
  4969.     else
  4970.         {
  4971.         draw_sprite(buff,19+team,20,24,0);
  4972.         draw_string(buff,2,224,56,GetTEXT( IDKC_TEXT ),31,2);
  4973.         draw_sprite(buff,46,376,24,0);
  4974.         }
  4975.     }
  4976.  
  4977. void 
  4978. penalty_menu(buff_info *buff, int team)
  4979.     {
  4980.     draw_menu_box(buff);
  4981.     if (scrmode==0x13)
  4982.         {
  4983.         draw_sprite(buff,30+team,10,11,0);
  4984.         draw_string(buff,0,96,30,GetTEXT( PENK_TEXT ),31,2);
  4985.         draw_sprite(buff,52,151,11,0);
  4986.         }
  4987.     else
  4988.         {
  4989.         draw_sprite(buff,19+team,20,24,0);
  4990.         draw_string(buff,2,192,56,GetTEXT( PENK_TEXT ),31,2);
  4991.         draw_sprite(buff,46,302,24,0);
  4992.         }
  4993.     }
  4994.  
  4995. void 
  4996. corner_menu(buff_info *buff, int team)
  4997.     {
  4998.     draw_menu_box(buff);
  4999.     if (scrmode==0x13)
  5000.         {
  5001.         draw_sprite(buff,30+team,10,11,0);
  5002.         draw_string(buff,0,96,30,GetTEXT( CORK_TEXT ),31,2);
  5003.         draw_sprite(buff,40,151,18,0);
  5004.         }
  5005.     else
  5006.         {
  5007.         draw_sprite(buff,19+team,20,24,0);
  5008.         draw_string(buff,2,192,56,GetTEXT( CORK_TEXT ),31,2);
  5009.         draw_sprite(buff,29,302,38,0);
  5010.         }
  5011.     }
  5012.  
  5013. void 
  5014. throw_menu(buff_info *buff, int team)
  5015.     {
  5016.     draw_menu_box(buff);
  5017.     if (scrmode==0x13)
  5018.         {
  5019.         draw_sprite(buff,30+team,10,11,0);
  5020.         draw_string(buff,0,96,30,GetTEXT( THIN_TEXT ),31,2);
  5021.         draw_sprite(buff,40,151,18,0);
  5022.         }
  5023.     else
  5024.         {
  5025.         draw_sprite(buff,19+team,20,24,0);
  5026.         draw_string(buff,2,192,56,GetTEXT( THIN_TEXT ),31,2);
  5027.         draw_sprite(buff,29,302,38,0);
  5028.         }
  5029.     }
  5030.  
  5031. void 
  5032. goalkick_menu(buff_info *buff, int team)
  5033.     {
  5034.     draw_menu_box(buff);
  5035.     if (scrmode==0x13)
  5036.         {
  5037.         draw_sprite(buff,30+team,10,11,0);
  5038.         draw_string(buff,0,96,30,GetTEXT( GKIK_TEXT ),31,2);
  5039.         draw_sprite(buff,40,151,18,0);
  5040.         }
  5041.     else
  5042.         {
  5043.         draw_sprite(buff,19+team,20,24,0);
  5044.         draw_string(buff,2,192,56,GetTEXT( GKIK_TEXT ),31,2);
  5045.         draw_sprite(buff,29,302,38,0);
  5046.         }
  5047.     }
  5048.  
  5049. void 
  5050. kickoff_menu(buff_info *buff, int team)
  5051.     {
  5052.     draw_menu_box(buff);
  5053.     if (scrmode==0x13)
  5054.         {
  5055.         draw_sprite(buff,30+team,10,11,0);
  5056.         draw_string(buff,0,96,30,GetTEXT( KIOF_TEXT ),31,2);
  5057.         draw_sprite(buff,40,151,18,0);
  5058.         }
  5059.     else
  5060.         {
  5061.         draw_sprite(buff,19+team,20,24,0);
  5062.         draw_string(buff,2,192,56,GetTEXT( KIOF_TEXT ),31,2);
  5063.         draw_sprite(buff,29,302,38,0);
  5064.         }
  5065.     }
  5066.  
  5067. void 
  5068. offside_menu(buff_info *buff, int team)
  5069.     {
  5070.     draw_menu_box(buff);
  5071.     if (scrmode==0x13)
  5072.         {
  5073.         draw_sprite(buff,30+team,10,11,0);
  5074.         draw_string(buff,0,112,30,GetTEXT( OFFS_TEXT ),31,2);
  5075.         draw_sprite(buff,52,188,11,0);
  5076.         }
  5077.     else
  5078.         {
  5079.         draw_sprite(buff,19+team,20,24,0);
  5080.         draw_string(buff,2,224,56,GetTEXT( OFFS_TEXT ),31,2);
  5081.         draw_sprite(buff,46,376,24,0);
  5082.         }
  5083.     }
  5084.  
  5085. void 
  5086. injured_menu(buff_info *buff, int team, int player)
  5087.     {
  5088.     int shirt;
  5089.     if (!team)
  5090.         shirt=ppt[player+((match_half&1)?11:0)].number-1;
  5091.     else
  5092.         shirt=ppt[player+((match_half&1)?0:11)].number-1;
  5093.     draw_menu_box(buff);
  5094.     if (scrmode==0x13)
  5095.         {
  5096.         draw_sprite(buff,30+team,10,11,0);
  5097.         draw_sprite(buff,2+shirt,16,21,0);
  5098.         draw_string(buff,0,160,30,GetTEXT( PLIN_TEXT ),127,1);
  5099.         if (!team)
  5100.             draw_string(buff,0,160,30,
  5101.                 GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  5102.                 31,0);
  5103.         else
  5104.             draw_string(buff,0,160,30,
  5105.                 GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  5106.                 31,0);
  5107.         draw_sprite(buff,52,280,11,0);
  5108.         }
  5109.     else
  5110.         {
  5111.         draw_sprite(buff,19+team,20,24,0);
  5112.         draw_string(buff,2,320,56,GetTEXT( PLIN_TEXT ),127,1);
  5113.         if (!team)
  5114.             {
  5115.             draw_sprite_s(buff,53+shirt,42,51,0);
  5116.             draw_string(buff,2,320,56,
  5117.                 GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  5118.                 31,0);
  5119.             }
  5120.         else                            
  5121.             {
  5122.             draw_sprite_s(buff,68+shirt,42,51,0);
  5123.             draw_string(buff,2,320,56,
  5124.                 GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  5125.                 31,0);
  5126.             }
  5127.         draw_sprite(buff,46,560,24,0);
  5128.         }
  5129.     }
  5130.  
  5131. extern referee_info referee_data[];
  5132.  
  5133. void 
  5134. ref_menu(buff_info *buff)
  5135.     {
  5136.     char tlstr[50];
  5137.     int ln;
  5138.     draw_menu_box(buff);
  5139.     if (scrmode==0x13)
  5140.         {
  5141.         draw_sprite(buff,52,13,11,0);
  5142.         draw_string(buff,0,160,30,GetTEXT( RFRE_TEXT ),207,1);
  5143.         strcpy(tlstr, EUROmatch_info.RefsName );
  5144. //        strcat(tlstr," = ");
  5145. //        strcat(tlstr,game_data[ referee_data[match_info.match_referee].country ].Nickname);
  5146.         draw_string(buff,0,160,30,tlstr,31,0);
  5147.         draw_sprite(buff,52,284,11,0);
  5148.         }
  5149.     else
  5150.         {
  5151.         draw_sprite(buff,46,26,24,0);
  5152.         draw_string(buff,2,320,56,GetTEXT( RFRE_TEXT ),207,1);
  5153.         strcpy(tlstr, EUROmatch_info.RefsName );
  5154. //        strcat(tlstr," = ");
  5155. //        strcat(tlstr,game_data[ referee_data[match_info.match_referee].country ].Nickname);
  5156.         draw_string(buff,2,320,56,tlstr,31,0);
  5157.         draw_sprite(buff,46,578,24,0);
  5158.         }
  5159.     }
  5160.  
  5161. void    GOAL_SCORED( int team, int scorer, int time )
  5162. {
  5163.     int    goal_slot    =    -1;
  5164.     int    goal_count    =    0;
  5165.  
  5166.         // FIND AN EMPTY GOAL SLOT WITHIN GOAL DATA...
  5167.  
  5168.         while    ( goal_slot==-1 )
  5169.         {
  5170.                     
  5171.             if ( goals[goal_count].goal_data.used == NULL )
  5172.             {
  5173.                  goal_slot                =    goal_count;
  5174.                 goals[goal_slot].goal_data.used        =    ACTIVE;                
  5175.             }
  5176.                  
  5177.             else
  5178.         
  5179.             {
  5180.             goal_count++;
  5181.             
  5182.                 if ( goal_count>90 )
  5183.                 {
  5184.                     goals[0].goal_data.used    =    NULL;
  5185.                     goal_count        =    0;
  5186.                 }
  5187.             }            
  5188.         }
  5189.  
  5190.  
  5191.     goals[goal_slot].goal_data.time        =    time+1;                
  5192.  
  5193.         // CALCULATE NORMAL GOAL....
  5194.  
  5195.  
  5196.         if    ( (time & O_G)==0 )
  5197.         {
  5198.             
  5199.             if ( scorer<11 )
  5200.             {
  5201.                 goals[goal_slot].goal_data.scorer    =    game_data[TEMPa].players[scorer].squad_number;    //was scorer-1
  5202.                 goals[goal_slot].goal_data.used|=        CREDIT_TEAMa;
  5203.                 EUROmatch_info.Team_A_goals++;
  5204.             }
  5205.             else
  5206.             {
  5207.                 goals[goal_slot].goal_data.scorer    =    game_data[TEMPb].players[scorer-11].squad_number;   //was scorer-12
  5208.                 goals[goal_slot].goal_data.used|=        CREDIT_TEAMb;
  5209.                 EUROmatch_info.Team_B_goals++;
  5210.             }
  5211.         }
  5212.  
  5213.  
  5214.         // CALCULATE OWN GOAL....
  5215.  
  5216.         if    ( (time & O_G)!=0 )
  5217.         {
  5218.  
  5219.         goals[goal_slot].goal_data.used        =    O_G >> 8;                
  5220.  
  5221.             if ( scorer<11 )     
  5222.             {
  5223.                 goals[goal_slot].goal_data.scorer    =    game_data[TEMPa].players[scorer].squad_number;         //was scorer-1
  5224.                 goals[goal_slot].goal_data.used|=        CREDIT_TEAMb;
  5225.                 EUROmatch_info.Team_B_goals++;
  5226.             }
  5227.  
  5228.             else
  5229.             {
  5230.                 goals[goal_slot].goal_data.scorer    =    game_data[TEMPb].players[scorer-11].squad_number;     //was scorer-12
  5231.                 goals[goal_slot].goal_data.used|=        CREDIT_TEAMa;
  5232.                 EUROmatch_info.Team_A_goals++;
  5233.             }
  5234.         }
  5235. }
  5236.  
  5237.  
  5238. void
  5239. score_breakdown_l(buff_info *buff)
  5240.     {
  5241.     int g,gc;
  5242.     int l;
  5243.     int m;
  5244.     char tstr[50];
  5245.  
  5246.     g=0;
  5247.     m=52;
  5248.     while (goals[g].goal_data.used)
  5249.         {
  5250.         if ((goals[g].goal_data.used&5)==4)
  5251.             {
  5252.             l=0;
  5253.             if (!(goals[g].goal_data.time&512))
  5254.                 {
  5255.                 for (int sf=0;sf<22;sf++)
  5256.                     if (game_data[TEMPa].players[sf].squad_number==goals[g].goal_data.scorer) break;
  5257.                 sprintf(tstr,"%s ",
  5258. //                    &game_data[setup.team_a].players[sf].name[game_data[setup.team_a].players[sf].goal_index]);
  5259.                     &GetPLAYERSname( EUROmatch_info.TeamAsquad[sf], setup.team_a, INITIAL_SURNAME )[0]);
  5260.                     
  5261.  
  5262.                 }
  5263.             else
  5264.                 {
  5265.                 for (int sf=0;sf<22;sf++)
  5266.                     if (game_data[TEMPb].players[sf].squad_number==goals[g].goal_data.scorer) break;
  5267.                 sprintf(tstr,"%s ",
  5268. //                    &game_data[setup.team_b].players[sf].name[game_data[setup.team_b].players[sf].goal_index]);
  5269.                     &GetPLAYERSname( EUROmatch_info.TeamBsquad[sf], setup.team_b, INITIAL_SURNAME )[0]);
  5270.                 }
  5271.             l+=draw_string(buff,0,l+40,m,tstr,157,0);
  5272.             gc=g;
  5273.             do    {
  5274.                 if (goals[gc].goal_data.time&768)
  5275.                     {
  5276.                     if (l>=50)    if ((m+=8,l=0)>52+5*8) goto mend1;
  5277.  
  5278.  
  5279. //-------------------------------------------------------------------------------
  5280. //                    if (EUROmatch_info.language!=2)
  5281. //                        if (goals[gc].goal_data.time&256)
  5282. //                            sprintf(tstr,"%d PEN",goals[gc].goal_data.time&255);
  5283. //                        else
  5284. //                            sprintf(tstr,"%d O.G",goals[gc].goal_data.time&255);
  5285. //                    else
  5286. //                        if (goals[gc].goal_data.time&256)
  5287. //                            sprintf(tstr,"%d ELF",goals[gc].goal_data.time&255);
  5288. //                        else
  5289. //                            sprintf(tstr,"%d ET",goals[gc].goal_data.time&255);
  5290. //-------------------------------------------------------------------------------
  5291.  
  5292.  
  5293.         // replaces above code... Forget about translations, new code will handle it.
  5294.  
  5295.                         if (goals[gc].goal_data.time&256)
  5296.                             sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( PENS_TEXT ) );
  5297.                         else
  5298.                             sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( OWNG_TEXT ) );
  5299.  
  5300.                     }
  5301.                 else
  5302.                     {
  5303.                     if (l>=78)    if ((m+=8,l=0)>52+5*8) goto mend1;
  5304.                     sprintf(tstr,"%d",goals[gc].goal_data.time);
  5305.                     }
  5306.                 l+=draw_string(buff,0,l+40,m,tstr,157,0);
  5307.                 goals[gc].goal_data.used|=1;
  5308.                 do {
  5309.                     gc++;
  5310.                     if ((goals[gc].goal_data.used&5)==4 && goals[gc].goal_data.scorer==goals[g].goal_data.scorer && (goals[gc].goal_data.time&512)==(goals[g].goal_data.time&512))
  5311.                         {
  5312.                         l+=draw_string(buff,0,l+40,m,",",157,0);
  5313.                         break;
  5314.                         }
  5315.                     } while (goals[gc].goal_data.used);
  5316.                 } while (goals[gc].goal_data.used);
  5317.             if ((m+=8)>52+5*8) goto mend1;
  5318.             }
  5319.         g++;
  5320.         }
  5321.     mend1:;
  5322.     mhgt=((m+40)>>4)<<4;
  5323.  
  5324.     g=0;
  5325.     m=52;
  5326.     while (goals[g].goal_data.used)
  5327.         {
  5328.         if ((goals[g].goal_data.used&9)==8)
  5329.             {
  5330.             l=0;
  5331.             if (!(goals[g].goal_data.time&512))
  5332.                 {
  5333.                 for (int sf=0;sf<22;sf++)
  5334.                     if (game_data[TEMPb].players[sf].squad_number==goals[g].goal_data.scorer) break;
  5335.  
  5336.                 sprintf(tstr,"%s ",
  5337. //                    &game_data[setup.team_b].players[sf].name[game_data[setup.team_b].players[sf].goal_index]);
  5338.                     &GetPLAYERSname( EUROmatch_info.TeamBsquad[sf], setup.team_b, INITIAL_SURNAME )[0]);
  5339.                 }
  5340.             else
  5341.                 {
  5342.                 for (int sf=0;sf<22;sf++)
  5343.                     if (game_data[TEMPa].players[sf].squad_number==goals[g].goal_data.scorer) break;
  5344.                 sprintf(tstr,"%s ",
  5345. //                    &game_data[setup.team_a].players[sf].name[game_data[setup.team_a].players[sf].goal_index]);
  5346.                     &GetPLAYERSname( EUROmatch_info.TeamAsquad[sf], setup.team_a, INITIAL_SURNAME )[0]);
  5347.                 }
  5348.             l+=draw_string(buff,0,l+178,m,tstr,157,0);
  5349.             gc=g;
  5350.             do    {
  5351.                 if (goals[gc].goal_data.time&768)
  5352.                     {
  5353.                     if (l>=50)    if ((m+=8,l=0)>52+5*8) goto mend2;
  5354.  
  5355. //-------------------------------------------------------------------------------
  5356. //                    if (match_info.language!=2)
  5357. //                        if (goals[gc].goal_data.time&256)
  5358. //                            sprintf(tstr,"%d PEN",goals[gc].goal_data.time&255);
  5359. //                        else
  5360. //                            sprintf(tstr,"%d O.G",goals[gc].goal_data.time&255);
  5361. //                    else
  5362. //                        if (goals[gc].goal_data.time&256)
  5363. //                            sprintf(tstr,"%d ELF",goals[gc].goal_data.time&255);
  5364. //                        else
  5365. //                            sprintf(tstr,"%d ET",goals[gc].goal_data.time&255);
  5366. //-------------------------------------------------------------------------------
  5367.  
  5368.         // replaces above code... Forget about translations, new code will handle it.
  5369.  
  5370.                         if (goals[gc].goal_data.time&256)
  5371.                             sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( PENS_TEXT ) );
  5372.                         else
  5373.                             sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( OWNG_TEXT ) );
  5374.  
  5375.                     
  5376.  
  5377.  
  5378.                     }
  5379.                 else
  5380.                     {
  5381.                     if (l>=78)    if ((m+=8,l=0)>52+5*8) goto mend2;
  5382.                     sprintf(tstr,"%d",goals[gc].goal_data.time);
  5383.                     }
  5384.                 l+=draw_string(buff,0,l+178,m,tstr,157,0);
  5385.                 goals[gc].goal_data.used|=1;
  5386.                 do {
  5387.                     gc++;
  5388.                     if ((goals[gc].goal_data.used&9)==8 && goals[gc].goal_data.scorer==goals[g].goal_data.scorer && (goals[gc].goal_data.time&512)==(goals[g].goal_data.time&512))
  5389.                         {
  5390.                         l+=draw_string(buff,0,l+178,m,",",157,0);
  5391.                         break;
  5392.                         }
  5393.                     } while (goals[gc].goal_data.used);
  5394.                 } while (goals[gc].goal_data.used);
  5395.             if ((m+=8)>52+5*8) goto mend2;
  5396.             }
  5397.         g++;
  5398.         }
  5399.     mend2:;
  5400.     if (mhgt<((m+40)>>4)<<4) mhgt=((m+40)>>4)<<4;
  5401.  
  5402.     gc=0;
  5403.     while (goals[gc].goal_data.used)
  5404.         goals[gc++].goal_data.used&=0xfe;
  5405.     }
  5406.  
  5407.  
  5408. void
  5409. score_breakdown_h(buff_info *buff)
  5410.     {
  5411.     int g,gc;
  5412.     int l;
  5413.     int m;
  5414.     char tstr[50];
  5415.  
  5416.     g=0;
  5417.     m=104;
  5418.     while (goals[g].goal_data.used)
  5419.         {
  5420.         if ((goals[g].goal_data.used&5)==4)
  5421.             {
  5422.             l=0;
  5423.             if (!(goals[g].goal_data.time&512))
  5424.                 {
  5425.                 for (int sf=0;sf<22;sf++)
  5426.                     if (game_data[TEMPa].players[sf].squad_number==goals[g].goal_data.scorer) break;
  5427.                 sprintf(tstr,"%s ",
  5428. //                    &game_data[setup.team_a].players[sf].name[game_data[setup.team_a].players[sf].goal_index]);
  5429.                     &GetPLAYERSname( EUROmatch_info.TeamAsquad[sf], setup.team_a, INITIAL_SURNAME )[0]);
  5430.                 }
  5431.             else
  5432.                 {
  5433.                 for (int sf=0;sf<22;sf++)
  5434.                     if (game_data[TEMPb].players[sf].squad_number==goals[g].goal_data.scorer) break;
  5435.                 sprintf(tstr,"%s ",
  5436. //                    &game_data[setup.team_b].players[sf].name[game_data[setup.team_b].players[sf].goal_index]);
  5437.                     &GetPLAYERSname( EUROmatch_info.TeamBsquad[sf], setup.team_b, INITIAL_SURNAME )[0]);
  5438.                 }
  5439.             l+=draw_string(buff,2,l+80,m,tstr,157,0);
  5440.             gc=g;
  5441.             do    {
  5442.                 if (goals[gc].goal_data.time&768)
  5443.                     {
  5444.                     if (l>=120)    if ((m+=13,l=0)>52+6*13) goto mend3;
  5445.  
  5446.  
  5447.  
  5448. //-------------------------------------------------------------------------------
  5449. //
  5450. //                    if (match_info.language!=2)
  5451. //                        if (goals[gc].goal_data.time&256)
  5452. //                            sprintf(tstr,"%d PEN",goals[gc].goal_data.time&255);
  5453. //                        else
  5454. //                            sprintf(tstr,"%d O.G",goals[gc].goal_data.time&255);
  5455. //                    else
  5456. //                        if (goals[gc].goal_data.time&256)
  5457. //                            sprintf(tstr,"%d ELF",goals[gc].goal_data.time&255);
  5458. //                        else
  5459. //                            sprintf(tstr,"%d ET",goals[gc].goal_data.time&255);
  5460. //
  5461. //-------------------------------------------------------------------------------
  5462.  
  5463.         // replaces above code... Forget about translations, new code will handle it.
  5464.  
  5465.                         if (goals[gc].goal_data.time&256)
  5466.                             sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( PENS_TEXT ) );
  5467.                         else
  5468.                             sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( OWNG_TEXT ) );
  5469.  
  5470.                     
  5471.  
  5472.  
  5473.                     }
  5474.                 else
  5475.                     {
  5476.                     if (l>=176)    if ((m+=13,l=0)>52+6*13) goto mend3;
  5477.                     sprintf(tstr,"%d",goals[gc].goal_data.time);
  5478.                     }
  5479.                 l+=draw_string(buff,2,l+80,m,tstr,157,0);
  5480.                 goals[gc].goal_data.used|=1;
  5481.                 do {
  5482.                     gc++;
  5483.                     if ((goals[gc].goal_data.used&5)==4 && goals[gc].goal_data.scorer==goals[g].goal_data.scorer && (goals[gc].goal_data.time&512)==(goals[g].goal_data.time&512))
  5484.                         {
  5485.                         l+=draw_string(buff,2,l+80,m,",",157,0);
  5486.                         break;
  5487.                         }
  5488.                     } while (goals[gc].goal_data.used);
  5489.                 } while (goals[gc].goal_data.used);
  5490.             if ((m+=13)>104+6*13) goto mend3;
  5491.             }
  5492.         g++;
  5493.         }
  5494.     mend3:;
  5495.     mhgt=((m+84)>>5)<<4;
  5496.  
  5497.     g=0;
  5498.     m=104;
  5499.     while (goals[g].goal_data.used)
  5500.         {
  5501.         if ((goals[g].goal_data.used&9)==8)
  5502.             {
  5503.             l=0;
  5504.             if (!(goals[g].goal_data.time&512))
  5505.                 {
  5506.                 for (int sf=0;sf<22;sf++)
  5507.                     if (game_data[TEMPb].players[sf].squad_number==goals[g].goal_data.scorer) break;
  5508.                 sprintf(tstr,"%s ",
  5509. //                    &game_data[setup.team_b].players[sf].name[game_data[setup.team_b].players[sf].goal_index]);
  5510.                     &GetPLAYERSname( EUROmatch_info.TeamBsquad[sf], setup.team_b, INITIAL_SURNAME )[0]);
  5511.                 }
  5512.             else
  5513.                 {
  5514.                 for (int sf=0;sf<22;sf++)
  5515.                     if (game_data[TEMPa].players[sf].squad_number==goals[g].goal_data.scorer) break;
  5516.                 sprintf(tstr,"%s ",
  5517. //                    &game_data[setup.team_a].players[sf].name[game_data[setup.team_a].players[sf].goal_index]);
  5518.                     &GetPLAYERSname( EUROmatch_info.TeamAsquad[sf], setup.team_a, INITIAL_SURNAME )[0]);
  5519.                 }
  5520.             l+=draw_string(buff,2,l+356,m,tstr,157,0);
  5521.             gc=g;
  5522.             do    {
  5523.                 if (goals[gc].goal_data.time&768)
  5524.                     {
  5525.                     if (l>=120)    if ((m+=13,l=0)>104+6*13) goto mend4;
  5526.  
  5527.  
  5528.  
  5529. //-------------------------------------------------------------------------------
  5530. //
  5531. //                    if (match_info.language!=2)
  5532. //                        if (goals[gc].goal_data.time&256)
  5533. //                            sprintf(tstr,"%d PEN",goals[gc].goal_data.time&255);
  5534. //                        else
  5535. //                            sprintf(tstr,"%d O.G",goals[gc].goal_data.time&255);
  5536. //                    else
  5537. //                        if (goals[gc].goal_data.time&256)
  5538. //                            sprintf(tstr,"%d ELF",goals[gc].goal_data.time&255);
  5539. //                        else
  5540. //                            sprintf(tstr,"%d ET",goals[gc].goal_data.time&255);
  5541. //
  5542. //-------------------------------------------------------------------------------
  5543.  
  5544.         // replaces above code... Forget about translations, new code will handle it.
  5545.  
  5546.                         if (goals[gc].goal_data.time&256)
  5547.                             sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( PENS_TEXT ) );
  5548.                         else
  5549.                             sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( OWNG_TEXT ) );
  5550.  
  5551.                     }
  5552.                 else
  5553.                     {
  5554.                     if (l>=176)    if ((m+=13,l=0)>104+6*13) goto mend4;
  5555.                     sprintf(tstr,"%d",goals[gc].goal_data.time);
  5556.                     }
  5557.                 l+=draw_string(buff,2,l+356,m,tstr,157,0);
  5558.                 goals[gc].goal_data.used|=1;
  5559.                 do {
  5560.                     gc++;
  5561.                     if ((goals[gc].goal_data.used&9)==8 && goals[gc].goal_data.scorer==goals[g].goal_data.scorer && (goals[gc].goal_data.time&512)==(goals[g].goal_data.time&512))
  5562.                         {
  5563.                         l+=draw_string(buff,2,l+356,m,",",157,0);
  5564.                         break;
  5565.                         }
  5566.                     } while (goals[gc].goal_data.used);
  5567.                 } while (goals[gc].goal_data.used);
  5568.             if ((m+=13)>104+6*13) goto mend4;
  5569.             }
  5570.         g++;
  5571.         }
  5572.     mend4:;
  5573.     if (mhgt<((m+84)>>5)<<4) mhgt=((m+84)>>5)<<4;
  5574.  
  5575.     gc=0;
  5576.     while (goals[gc].goal_data.used)
  5577.         goals[gc++].goal_data.used&=0xfe;
  5578.     }
  5579.  
  5580.  
  5581. void 
  5582. fulltime_menu(buff_info *buff)
  5583.     {
  5584.     char tstr[50];
  5585.     draw_menu_box(buff);
  5586.     if (scrmode==0x13)
  5587.         {
  5588.         draw_sprite(buff,30,10,11,0);
  5589.         draw_sprite(buff,31,243,11,0);
  5590.         draw_string(buff,1,144,30,GetTEXT( FLTM_TEXT ),207,2);
  5591.         draw_string(buff,0,110,42, EUROmatch_info.TeamAname, 31,1);
  5592.         sprintf(tstr,"%d",team_a_goals);
  5593.         draw_string(buff,0,131,42,tstr,31,1);
  5594.         sprintf(tstr,"%d",team_b_goals);
  5595.         draw_string(buff,0,157,42,tstr,31,0);
  5596.         draw_string(buff,0,178,42,EUROmatch_info.TeamBname,31,0);
  5597. //        draw_sprite(buff,49,134,38,0);
  5598.         score_breakdown_l(buff);
  5599.         }
  5600.     else
  5601.         {
  5602.         draw_sprite(buff,19,20,24,0);
  5603.         draw_sprite(buff,20,486,24,0);
  5604.         draw_string(buff,2,288,56,GetTEXT( FLTM_TEXT ),207,2);
  5605.         draw_string(buff,2,220,80,EUROmatch_info.TeamAname,31,1);
  5606.         sprintf(tstr,"%d",team_a_goals);
  5607.         draw_string(buff,2,262,80,tstr,31,1);
  5608.         sprintf(tstr,"%d",team_b_goals);
  5609.         draw_string(buff,2,314,80,tstr,31,0);
  5610.         draw_string(buff,2,356,80,EUROmatch_info.TeamBname,31,0);
  5611. //        draw_sprite(buff,43,268,72,0);
  5612.         score_breakdown_h(buff);
  5613.         }
  5614.     }
  5615.  
  5616. void 
  5617. extratime_menu(buff_info *buff)
  5618.     {
  5619.     char tstr[50];
  5620.     draw_menu_box(buff);
  5621.     if (scrmode==0x13)
  5622.         {
  5623.         draw_sprite(buff,30,10,11,0);
  5624.         draw_sprite(buff,31,243,11,0);
  5625.         draw_string(buff,1,144,30,GetTEXT( EXTM_TEXT ),207,2);
  5626.         draw_string(buff,0,110,42,EUROmatch_info.TeamAname,31,1);
  5627.         sprintf(tstr,"%d",team_a_goals);
  5628.         draw_string(buff,0,131,42,tstr,31,1);
  5629.         sprintf(tstr,"%d",team_b_goals);
  5630.         draw_string(buff,0,157,42,tstr,31,0);
  5631.         draw_string(buff,0,178,42,EUROmatch_info.TeamBname,31,0);
  5632. //        draw_sprite(buff,49,134,38,0);
  5633.         score_breakdown_l(buff);
  5634.         }
  5635.     else
  5636.         {
  5637.         draw_sprite(buff,19,20,24,0);
  5638.         draw_sprite(buff,20,486,24,0);
  5639.         draw_string(buff,2,288,56,GetTEXT( EXTM_TEXT ),207,2);
  5640.         draw_string(buff,2,220,80,EUROmatch_info.TeamAname,31,1);
  5641.         sprintf(tstr,"%d",team_a_goals);
  5642.         draw_string(buff,2,262,80,tstr,31,1);
  5643.         sprintf(tstr,"%d",team_b_goals);
  5644.         draw_string(buff,2,314,80,tstr,31,0);
  5645.         draw_string(buff,2,356,80,EUROmatch_info.TeamBname,31,0);
  5646. //        draw_sprite(buff,43,268,72,0);
  5647.         score_breakdown_h(buff);
  5648.         }
  5649.     }
  5650.  
  5651. void 
  5652. halftime_menu(buff_info *buff)
  5653.     {
  5654.     char tstr[50];
  5655.     draw_menu_box(buff);
  5656.     if (scrmode==0x13)
  5657.         {
  5658.         draw_sprite(buff,30,10,11,0);
  5659.         draw_sprite(buff,31,243,11,0);
  5660.         draw_string(buff,1,144,30,GetTEXT( HFTM_TEXT ),207,2);
  5661.         draw_string(buff,0,110,42,EUROmatch_info.TeamAname,31,1);
  5662.         sprintf(tstr,"%d",team_a_goals);
  5663.         draw_string(buff,0,131,42,tstr,31,1);
  5664.         sprintf(tstr,"%d",team_b_goals);
  5665.         draw_string(buff,0,157,42,tstr,31,0);
  5666.         draw_string(buff,0,178,42,EUROmatch_info.TeamBname,31,0);
  5667. //        draw_sprite(buff,49,134,38,0);
  5668.         score_breakdown_l(buff);
  5669.         }
  5670.     else
  5671.         {
  5672.         draw_sprite(buff,19,20,24,0);
  5673.         draw_sprite(buff,20,486,24,0);
  5674.         draw_string(buff,2,288,56,GetTEXT( HFTM_TEXT ),207,2);
  5675.         draw_string(buff,2,220,80,EUROmatch_info.TeamAname,31,1);
  5676.         sprintf(tstr,"%d",team_a_goals);
  5677.         draw_string(buff,2,262,80,tstr,31,1);
  5678.         sprintf(tstr,"%d",team_b_goals);
  5679.         draw_string(buff,2,314,80,tstr,31,0);
  5680.         draw_string(buff,2,356,80,EUROmatch_info.TeamBname,31,0);
  5681. //        draw_sprite(buff,43,268,72,0);
  5682.         score_breakdown_h(buff);
  5683.         }
  5684.     }
  5685.  
  5686.  
  5687. void 
  5688. penalty_shootout_menu(buff_info *buff)
  5689.     {
  5690.     char tstr[50];
  5691.     draw_menu_box(buff);
  5692.     if (scrmode==0x13)
  5693.         {
  5694.         draw_sprite(buff,30,10,11,0);
  5695.         draw_sprite(buff,31,243,11,0);
  5696.         draw_string(buff,1,144,30,GetTEXT( PNST_TEXT ),207,2);
  5697.         draw_string(buff,0,110,42,EUROmatch_info.TeamAname,31,1);
  5698.         sprintf(tstr,"%d",team_a_goals);
  5699.         draw_string(buff,0,131,42,tstr,31,1);
  5700.         sprintf(tstr,"%d",team_b_goals);
  5701.         draw_string(buff,0,157,42,tstr,31,0);
  5702.         draw_string(buff,0,178,42,EUROmatch_info.TeamBname,31,0);
  5703. //        draw_sprite(buff,49,134,38,0);
  5704.         score_breakdown_l(buff);
  5705.         }
  5706.     else
  5707.         {
  5708.         draw_sprite(buff,19,20,24,0);
  5709.         draw_sprite(buff,20,486,24,0);
  5710.         draw_string(buff,2,288,56,GetTEXT( PNST_TEXT ),207,2);
  5711.         draw_string(buff,2,220,80,EUROmatch_info.TeamAname,31,1);
  5712.         sprintf(tstr,"%d",team_a_goals);
  5713.         draw_string(buff,2,262,80,tstr,31,1);
  5714.         sprintf(tstr,"%d",team_b_goals);
  5715.         draw_string(buff,2,314,80,tstr,31,0);
  5716.         draw_string(buff,2,356,80,EUROmatch_info.TeamBname,31,0);
  5717. //        draw_sprite(buff,43,268,72,0);
  5718.         score_breakdown_h(buff);
  5719.         }
  5720.     }
  5721.  
  5722.  
  5723. void 
  5724. final_score_menu(buff_info *buff)
  5725.     {
  5726.     char tstr[50];
  5727.     draw_menu_box(buff);
  5728.     if (scrmode==0x13)
  5729.         {
  5730.         draw_sprite(buff,30,10,11,0);
  5731.         draw_sprite(buff,31,243,11,0);
  5732.         draw_string(buff,1,144,30,GetTEXT( FNSP_TEXT ),207,2);
  5733.         draw_string(buff,0,110,42,EUROmatch_info.TeamAname,31,1);
  5734.         sprintf(tstr,"%d",team_a_goals);
  5735.         draw_string(buff,0,131,42,tstr,31,1);
  5736.         sprintf(tstr,"%d",team_b_goals);
  5737.         draw_string(buff,0,157,42,tstr,31,0);
  5738.         draw_string(buff,0,178,42,EUROmatch_info.TeamBname,31,0);
  5739. //        draw_sprite(buff,49,134,38,0);
  5740.         score_breakdown_l(buff);
  5741.         }
  5742.     else
  5743.         {
  5744.         draw_sprite(buff,19,20,24,0);
  5745.         draw_sprite(buff,20,486,24,0);
  5746.         draw_string(buff,2,288,56,GetTEXT( FNSP_TEXT ),207,2);
  5747.         draw_string(buff,2,220,80,EUROmatch_info.TeamAname,31,1);
  5748.         sprintf(tstr,"%d",team_a_goals);
  5749.         draw_string(buff,2,262,80,tstr,31,1);
  5750.         sprintf(tstr,"%d",team_b_goals);
  5751.         draw_string(buff,2,314,80,tstr,31,0);
  5752.         draw_string(buff,2,356,80,EUROmatch_info.TeamBname,31,0);
  5753. //        draw_sprite(buff,43,268,72,0);
  5754.         score_breakdown_h(buff);
  5755.         }
  5756.     }
  5757.  
  5758. void 
  5759. owngoal_menu(buff_info *buff, int team, int player, int time)
  5760.     {
  5761.     int shirt;
  5762.     if (!team)
  5763.         shirt=ppt[player+((match_half&1)?11:0)].number-1;
  5764.     else
  5765.         shirt=ppt[player+((match_half&1)?0:11)].number-1;
  5766.     draw_menu_box(buff);
  5767.     if (scrmode==0x13)
  5768.         {
  5769.         draw_sprite(buff,30+team,10,11,0);
  5770.         draw_sprite(buff,2+shirt,16,21,0);
  5771.         draw_string(buff,0,160,30,GetTEXT( OWGL_TEXT ),207,1);
  5772.         if (!team)
  5773.             draw_string(buff,0,160,30,
  5774.                 GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  5775.                 31,0);
  5776.         else
  5777.             draw_string(buff,0,160,30,
  5778.                 GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  5779.                 31,0);
  5780.         draw_sprite(buff,40,278,18,0);
  5781.         }
  5782.     else
  5783.         {
  5784.         draw_sprite(buff,19+team,20,24,0);
  5785.         draw_string(buff,2,320,56,GetTEXT( OWGL_TEXT ),207,1);
  5786.         if (!team)
  5787.             {
  5788.             draw_sprite_s(buff,53+shirt,42,51,0);
  5789.             draw_string(buff,2,320,56,
  5790.                 GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  5791.                 31,0);
  5792.             }
  5793.         else
  5794.             {
  5795.             draw_sprite_s(buff,68+shirt,42,51,0);
  5796.             draw_string(buff,2,320,56,
  5797.                 GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  5798.                 31,0);
  5799.             }
  5800.         draw_sprite(buff,29,556,38,0);
  5801.         }
  5802.     }
  5803.  
  5804. #define M_WIDTH 256
  5805. extern short stat_sheet[11][2];
  5806.  
  5807. void 
  5808. stats_menu(buff_info *buff)
  5809.     {
  5810.     draw_menu_box(buff);
  5811.     if (scrmode==0x13)
  5812.         {
  5813.         draw_sprite(buff,30,8,8,0);    // Kit
  5814.         draw_sprite(buff,31,256-48,8,0);    // Kit
  5815.         draw_string(buff,0,M_WIDTH/2,32,"MATCH STATISTICS",207,2);
  5816.         draw_string(buff,0,M_WIDTH/2,54,"Tackling",31,2);
  5817.         draw_string(buff,0,M_WIDTH/2,61,"Passing",31,2);
  5818.         draw_string(buff,0,M_WIDTH/2,68,"Shooting",31,2);
  5819.         draw_string(buff,0,M_WIDTH/2,75,"Possession",31,2);
  5820.         draw_string(buff,0,M_WIDTH/2,82,"Work",31,2);
  5821.         draw_string(buff,0,M_WIDTH/2,89,"Corners",31,2);
  5822.         draw_string(buff,0,M_WIDTH/2,96,"Direct Free-kicks",31,2);
  5823.         draw_string(buff,0,M_WIDTH/2,103,"Penalties",31,2);
  5824.         draw_string(buff,0,M_WIDTH/2,110,"Offsides committed",31,2);
  5825.         draw_string(buff,0,M_WIDTH/2,117,"Yellow cards",31,2);
  5826.         draw_string(buff,0,M_WIDTH/2,124,"Red cards",31,2);
  5827.  
  5828.         char str1[20],str2[20];
  5829.         for (short i=0; i<11; i++)
  5830.             {
  5831.             if (i<4)
  5832.                 {
  5833.                 sprintf(str1,"%d%%",stat_sheet[i][0]);
  5834.                 sprintf(str2,"%d%%",stat_sheet[i][1]);
  5835.                 }
  5836.             else
  5837.                 {
  5838.                 sprintf(str1,"%d",stat_sheet[i][0]);
  5839.                 sprintf(str2,"%d",stat_sheet[i][1]);
  5840.                 }
  5841.             
  5842.             draw_string(buff,0,16,54+(i*7),str1,31,0);
  5843.             draw_string(buff,0,256-32,54+(i*7),str2,31,1);
  5844.             }
  5845.  
  5846.         }
  5847.     else
  5848.         {
  5849.         draw_string(buff,2,192,56,GetTEXT( KIOF_TEXT ),31,2);
  5850.         }
  5851.     }
  5852.  
  5853.  
  5854. void draw_m_butt(buff_info *buff,int x,int y,char *string,BYTE col,char *legend)
  5855.     {
  5856.     if (scrmode==0x13)
  5857.         {
  5858.         draw_sprite(buff,36,x,y,0);
  5859.         draw_string(buff,0,x+23,y+5,string,col,2);
  5860.         if (legend!=NULL) draw_string(buff,0,x+2,y-1,legend,157,2);
  5861.         }
  5862.     else
  5863.         {
  5864.         draw_sprite(buff,25,x,y,0);
  5865.         draw_string(buff,2,x+45,y+8,string,col,2);
  5866.         if (legend!=NULL) draw_string(buff,2,x+4,y-2,legend,157,2);
  5867.         }
  5868.     }
  5869.  
  5870. void draw_l_butt(buff_info *buff,int x,int y,char *string,BYTE col,char *legend)
  5871.     {
  5872.     if (scrmode==0x13)
  5873.         {
  5874.         draw_sprite(buff,35,x,y,0);
  5875.         draw_string(buff,0,x+41,y+5,string,col,2);
  5876.         if (legend!=NULL) draw_string(buff,0,x+2,y-1,legend,157,2);
  5877.         }
  5878.     else
  5879.         {
  5880.         draw_sprite(buff,24,x,y,0);
  5881.         draw_string(buff,2,x+82,y+8,string,col,2);
  5882.         if (legend!=NULL) draw_string(buff,2,x+4,y-2,legend,157,2);
  5883.         }
  5884.     }
  5885.  
  5886. void draw_s_butt(buff_info *buff,int x,int y,char *string,BYTE col,char *legend)
  5887.     {
  5888.     if (scrmode==0x13)
  5889.         {
  5890.         draw_sprite(buff,37,x,y,0);
  5891.         draw_string(buff,0,x+15,y+5,string,col,2);
  5892.         if (legend!=NULL) draw_string(buff,0,x,y-1,legend,157,2);
  5893.         }
  5894.     else
  5895.         {
  5896.         draw_sprite(buff,26,x,y,0);
  5897.         draw_string(buff,2,x+29,y+8,string,col,2);
  5898.         if (legend!=NULL) draw_string(buff,2,x,y-2,legend,157,2);
  5899.         }
  5900.     }
  5901.  
  5902. struct
  5903.     {
  5904.     int formation;
  5905.     int sub_off,sub_on;
  5906.     }option_info;
  5907. int sub_c;
  5908.  
  5909. extern short replay_seconds;
  5910. extern char allow_replay;
  5911.  
  5912. int opt_b;
  5913. void 
  5914. options_menu(buff_info *buff, int team, int user_no)
  5915.     {
  5916.     char tstr[50];
  5917.     if (scrmode==0x13)
  5918.         {
  5919.         if (opt_b!=0) draw_l_butt(buff,62,32,GetTEXT( RPLY_TEXT ),(replay_seconds==0||!allow_replay)?2:31,"F1");
  5920.         if (opt_b!=1) draw_l_butt(buff,62,48,GetTEXT( SBTN_TEXT ),(match_mode||!EUROmatch_info.substitutes||sub_c<2||user_no<=0)?2:31,"F2");
  5921.         if (opt_b!=2) draw_l_butt(buff,62,64,GetTEXT( FRMN_TEXT ),user_no<=0?2:31,"F3");
  5922.         if (opt_b!=3) draw_l_butt(buff,62,80,GetTEXT( CANL_TEXT ),31,"F4");
  5923.         draw_menu_box(buff);
  5924.         if (opt_b==0) draw_l_butt(buff,62,32,GetTEXT( RPLY_TEXT ),31,"F1");
  5925.         if (opt_b==1) draw_l_butt(buff,62,48,GetTEXT( SBTN_TEXT ),31,"F2");
  5926.         if (opt_b==2) draw_l_butt(buff,62,64,GetTEXT( FRMN_TEXT ),31,"F3");
  5927.         if (opt_b==3) draw_l_butt(buff,62,80,GetTEXT( CANL_TEXT ),31,"F4");
  5928.         if (user_no>0)
  5929.             {
  5930.              draw_sprite(buff,30+team,18,38,0);
  5931.             sprintf(tstr,"PLAYER %d",user_no);
  5932.             draw_string(buff,0,36,87,tstr,157,2);
  5933.             }
  5934.         else
  5935.              draw_sprite(buff,52,22,45,0);
  5936.         }
  5937.     else
  5938.         {
  5939.         if (opt_b!=0) draw_l_butt(buff,124,64,GetTEXT( RPLY_TEXT ),(replay_seconds==0||!allow_replay)?2:31,"F1");
  5940.         if (opt_b!=1) draw_l_butt(buff,124,96,GetTEXT( SBTN_TEXT ),(match_mode||!EUROmatch_info.substitutes||sub_c<2||user_no<=0)?2:31,"F2");
  5941.         if (opt_b!=2) draw_l_butt(buff,124,128,GetTEXT( FRMN_TEXT ),user_no<=0?2:31,"F3");
  5942.         if (opt_b!=3) draw_l_butt(buff,124,160,GetTEXT( CANL_TEXT ),31,"F4");
  5943.         draw_menu_box(buff);
  5944.         if (opt_b==0) draw_l_butt(buff,124,64,GetTEXT( RPLY_TEXT ),31,"F1");
  5945.         if (opt_b==1) draw_l_butt(buff,124,96,GetTEXT( SBTN_TEXT ),31,"F2");
  5946.         if (opt_b==2) draw_l_butt(buff,124,128,GetTEXT( FRMN_TEXT ),31,"F3");
  5947.         if (opt_b==3) draw_l_butt(buff,124,160,GetTEXT( CANL_TEXT ),31,"F4");
  5948.         if (user_no>0)
  5949.             {
  5950.             draw_sprite(buff,19+team,36,76,0);
  5951.             sprintf(tstr,"PLAYER %d",user_no);
  5952.             draw_string(buff,2,72,174,tstr,157,2);
  5953.             }
  5954.         else
  5955.              draw_sprite(buff,46,45,90,0);
  5956.         }
  5957.     }
  5958.  
  5959. char forms[10][6]=
  5960.     {
  5961.     "4=3=3",
  5962.     "5=3=2",
  5963.     "6=3=1",
  5964.     "4=2=4",
  5965.     "5=1=4",
  5966.     "4=0=6",
  5967.     "3=1=6",
  5968.     "4=1=5",
  5969.     "5=2=3",
  5970.     "4=4=2",
  5971.     };
  5972.  
  5973. int for_b;
  5974. void 
  5975. formation_menu(buff_info *buff, int team, int user_no)
  5976.     {
  5977.     char tstr[50];
  5978.     if (scrmode==0x13)
  5979.         {
  5980.         if (for_b!=0) draw_l_butt(buff,62,32,forms[option_info.formation],31,"F1");
  5981.         if (for_b!=1) draw_l_butt(buff,62,48,GetTEXT( SLCT_TEXT ),31,"F2");
  5982.         if (for_b!=2) draw_l_butt(buff,62,64,GetTEXT( CANL_TEXT ),31,"F3");
  5983.         draw_menu_box(buff);
  5984.         if (for_b==0) draw_l_butt(buff,62,32,forms[option_info.formation],31,"F1");
  5985.         if (for_b==1) draw_l_butt(buff,62,48,GetTEXT( SLCT_TEXT ),31,"F2");
  5986.         if (for_b==2) draw_l_butt(buff,62,64,GetTEXT( CANL_TEXT ),31,"F3");
  5987.         draw_sprite(buff,30+team,18,34,0);
  5988.         }
  5989.     else
  5990.         {
  5991.         if (for_b!=0) draw_l_butt(buff,124,64,forms[option_info.formation],31,"F1");
  5992.         if (for_b!=1) draw_l_butt(buff,124,96,GetTEXT( SLCT_TEXT ),31,"F2");
  5993.         if (for_b!=2) draw_l_butt(buff,124,128,GetTEXT( CANL_TEXT ),31,"F3");
  5994.         draw_menu_box(buff);
  5995.         if (for_b==0) draw_l_butt(buff,124,64,forms[option_info.formation],31,"F1");
  5996.         if (for_b==1) draw_l_butt(buff,124,96,GetTEXT( SLCT_TEXT ),31,"F2");
  5997.         if (for_b==2) draw_l_butt(buff,124,128,GetTEXT( CANL_TEXT ),31,"F3");
  5998.         draw_sprite(buff,19+team,36,68,0);
  5999.         }
  6000.     }
  6001.  
  6002. int sub_b;
  6003. void 
  6004. substitution_menu(buff_info *buff, int team, int user_no)
  6005.     {
  6006.     char tstr[50];
  6007.     if (scrmode==0x13)
  6008.         {
  6009.         if (sub_b!=0) draw_m_butt(buff,88,32,GetTEXT( SOFF_TEXT ),31,"F1");
  6010.         if (sub_b!=1) draw_l_butt(buff,70,48,GetTEXT( SUBT_TEXT ),31,"F2");
  6011.         if (sub_b!=2) draw_l_butt(buff,70,64,GetTEXT( CANL_TEXT ),31,"F3");
  6012.         if (sub_b!=3) draw_m_butt(buff,88,80,GetTEXT( SBON_TEXT ),31,"F4");
  6013.         draw_menu_box(buff);
  6014.         if (sub_b==0) draw_m_butt(buff,88,32,GetTEXT( SOFF_TEXT ),31,"F1");
  6015.         if (sub_b==1) draw_l_butt(buff,70,48,GetTEXT( SUBT_TEXT ),31,"F2");
  6016.         if (sub_b==2) draw_l_butt(buff,70,64,GetTEXT( CANL_TEXT ),31,"F3");
  6017.         if (sub_b==3) draw_m_butt(buff,88,80,GetTEXT( SBON_TEXT ),31,"F4");
  6018.         draw_sprite(buff,30+team,23,48,0);
  6019.         draw_sprite(buff,30+team,166,38,0);
  6020.         if (!team)
  6021.             {
  6022.             draw_string(buff,0,41,37,
  6023. //                &game_data[setup.team_a].players[option_info.sub_off].name[game_data[setup.team_a].players[option_info.sub_off].goal_index],
  6024.                 &GetPLAYERSname( EUROmatch_info.TeamAsquad[option_info.sub_off], setup.team_a, INITIAL_SURNAME )[0],
  6025.                 157,2);
  6026.             draw_sprite(buff,2+teams[option_info.sub_off+((match_half&1)?11:0)].shirt-1,29,58,0);
  6027.             draw_string(buff,0,183,85,
  6028. //                &game_data[setup.team_a].players[option_info.sub_on].name[game_data[setup.team_a].players[option_info.sub_on].goal_index],
  6029.                 &GetPLAYERSname( EUROmatch_info.TeamAsquad[option_info.sub_on], setup.team_a, INITIAL_SURNAME )[0],
  6030.                 157,2);
  6031.             draw_sprite(buff,2+option_info.sub_on,172,48,0);
  6032.             }
  6033.         else
  6034.             {
  6035.             draw_string(buff,0,41,37,
  6036. //                &game_data[setup.team_b].players[option_info.sub_off].name[game_data[setup.team_b].players[option_info.sub_off].goal_index],
  6037.                 &GetPLAYERSname( EUROmatch_info.TeamBsquad[option_info.sub_off], setup.team_b, INITIAL_SURNAME )[0],
  6038.                 157,2);
  6039.             draw_sprite(buff,2+teams[option_info.sub_off+((match_half&1)?0:11)].shirt-1,29,58,0);
  6040.             draw_string(buff,0,183,85,
  6041. //                &game_data[setup.team_b].players[option_info.sub_on].name[game_data[setup.team_b].players[option_info.sub_on].goal_index],
  6042.                 &GetPLAYERSname( EUROmatch_info.TeamBsquad[option_info.sub_on], setup.team_b, INITIAL_SURNAME )[0],
  6043.                 157,2);
  6044.             draw_sprite(buff,2+option_info.sub_on,172,48,0);
  6045.             }
  6046.         }
  6047.     else
  6048.         {
  6049.         if (sub_b!=0) draw_m_butt(buff,176,64,GetTEXT( SOFF_TEXT ),31,"F1");
  6050.         if (sub_b!=1) draw_l_butt(buff,140,96,GetTEXT( SUBT_TEXT ),31,"F2");
  6051.         if (sub_b!=2) draw_l_butt(buff,140,128,GetTEXT( CANL_TEXT ),31,"F3");
  6052.         if (sub_b!=3) draw_m_butt(buff,176,160,GetTEXT( SBON_TEXT ),31,"F4");
  6053.         draw_menu_box(buff);
  6054.         if (sub_b==0) draw_m_butt(buff,176,64,GetTEXT( SOFF_TEXT ),31,"F1");
  6055.         if (sub_b==1) draw_l_butt(buff,140,96,GetTEXT( SUBT_TEXT ),31,"F2");
  6056.         if (sub_b==2) draw_l_butt(buff,140,128,GetTEXT( CANL_TEXT ),31,"F3");
  6057.         if (sub_b==3) draw_m_butt(buff,176,160,GetTEXT( SBON_TEXT ),31,"F4");
  6058.         draw_sprite(buff,19+team,46,96,0);
  6059.         draw_sprite(buff,19+team,332,76,0);
  6060.         if (!team)
  6061.             {
  6062.             draw_string(buff,2,81,72,
  6063. //                &game_data[setup.team_a].players[option_info.sub_off].name[game_data[setup.team_a].players[option_info.sub_off].goal_index],
  6064.                 &GetPLAYERSname( EUROmatch_info.TeamAsquad[option_info.sub_off], setup.team_a, INITIAL_SURNAME )[0],
  6065.                 157,2);
  6066.             draw_sprite_s(buff,53+teams[option_info.sub_off+((match_half&1)?11:0)].shirt-1,68,123,0);
  6067.             draw_string(buff,2,366,168,
  6068. //                &game_data[setup.team_a].players[option_info.sub_on].name[game_data[setup.team_a].players[option_info.sub_on].goal_index],
  6069.                 &GetPLAYERSname( EUROmatch_info.TeamAsquad[option_info.sub_on], setup.team_a, INITIAL_SURNAME )[0],
  6070.                 157,2);
  6071.             draw_sprite_s(buff,53+option_info.sub_on,354,103,0);
  6072.             }
  6073.         else
  6074.             {
  6075.             draw_string(buff,2,81,72,
  6076. //                &game_data[setup.team_b].players[option_info.sub_off].name[game_data[setup.team_b].players[option_info.sub_off].goal_index],
  6077.                 &GetPLAYERSname( EUROmatch_info.TeamBsquad[option_info.sub_off], setup.team_b, INITIAL_SURNAME )[0],
  6078.                 157,2);
  6079.             draw_sprite_s(buff,68+teams[option_info.sub_off+((match_half&1)?0:11)].shirt-1,68,123,0);
  6080.             draw_string(buff,2,366,168,
  6081. //                &game_data[setup.team_b].players[option_info.sub_on].name[game_data[setup.team_b].players[option_info.sub_on].goal_index],
  6082.                 &GetPLAYERSname( EUROmatch_info.TeamBsquad[option_info.sub_on], setup.team_b, INITIAL_SURNAME )[0],
  6083.                 157,2);
  6084.             draw_sprite_s(buff,68+option_info.sub_on,354,103,0);
  6085.             }
  6086.         }
  6087.     }
  6088.  
  6089. int rep_b;
  6090. int play,speed;
  6091. float reppos;
  6092. void 
  6093. replay_menu(buff_info *buff, int user_no)
  6094.     {
  6095.     char tstr[50];
  6096.     if (scrmode==0x13)
  6097.         {
  6098.         if (rep_b!=0) 
  6099.             {
  6100.             draw_s_butt(buff,112,32,"",31,"F1");
  6101.             draw_sprite_hf(buff,39,121,35,0);
  6102.             draw_sprite_hf(buff,39,127,35,0);
  6103.             }
  6104.         if (rep_b!=1) 
  6105.             {
  6106.             draw_s_butt(buff,146,32,"",31,"F2");
  6107.             draw_sprite(buff,39,155,35,0);
  6108.             draw_sprite(buff,39,161,35,0);
  6109.             }
  6110.         if (rep_b!=2) draw_s_butt(buff,185,32,"",31,"F3");
  6111.         if (!play) draw_sprite(buff,39,197,35,0);
  6112.         if (rep_b!=3) draw_m_butt(buff,225,32,GetTEXT( DONE_TEXT ),31,"F4");
  6113.         draw_menu_box(buff);
  6114.         sprintf(tstr,"%.2f",reppos);
  6115.         draw_m_butt(buff,17,32,tstr,157,NULL);
  6116.         sprintf(tstr,"%d",speed);
  6117.         draw_s_butt(buff,69,32,tstr,31,NULL);
  6118.         if (rep_b==0) 
  6119.             {
  6120.             draw_s_butt(buff,112,32,"",31,"F1");
  6121.             draw_sprite_hf(buff,39,121,35,0);
  6122.             draw_sprite_hf(buff,39,127,35,0);
  6123.             }
  6124.         if (rep_b==1) 
  6125.             {
  6126.             draw_s_butt(buff,146,32,"",31,"F2");
  6127.             draw_sprite(buff,39,155,35,0);
  6128.             draw_sprite(buff,39,161,35,0);
  6129.             }
  6130.         if (rep_b==2) draw_s_butt(buff,185,32,"",31,"F3");
  6131.         if (play||rep_b==2) draw_sprite(buff,39,197,35,0);
  6132.         if (rep_b==3) draw_m_butt(buff,225,32,GetTEXT( DONE_TEXT ),31,"F4");
  6133.         }
  6134.     else
  6135.         {
  6136.         if (rep_b!=0) 
  6137.             {
  6138.             draw_s_butt(buff,224,64,"",31,"F1");
  6139.             draw_sprite_hf(buff,28,240,70,0);
  6140.             draw_sprite_hf(buff,28,252,70,0);
  6141.             }
  6142.         if (rep_b!=1) 
  6143.             {
  6144.             draw_s_butt(buff,292,64,"",31,"F2");
  6145.             draw_sprite(buff,28,310,70,0);
  6146.             draw_sprite(buff,28,322,70,0);
  6147.             }
  6148.         if (rep_b!=2) draw_s_butt(buff,370,64,"",31,"F3");
  6149.         if (!play) draw_sprite(buff,28,394,70,0);
  6150.         if (rep_b!=3) draw_m_butt(buff,447,64,GetTEXT( DONE_TEXT ),31,"F4");
  6151.         draw_menu_box(buff);
  6152.         sprintf(tstr,"%.2f",reppos);
  6153.         draw_m_butt(buff,34,64,tstr,157,NULL);
  6154.         sprintf(tstr,"%d",speed);
  6155.         draw_s_butt(buff,138,64,tstr,31,NULL);
  6156.         if (rep_b==0) 
  6157.             {
  6158.             draw_s_butt(buff,224,64,"",31,"F1");
  6159.             draw_sprite_hf(buff,28,240,70,0);
  6160.             draw_sprite_hf(buff,28,252,70,0);
  6161.             }
  6162.         if (rep_b==1) 
  6163.             {
  6164.             draw_s_butt(buff,292,64,"",31,"F2");
  6165.             draw_sprite(buff,28,310,70,0);
  6166.             draw_sprite(buff,28,322,70,0);
  6167.             }
  6168.         if (rep_b==2) draw_s_butt(buff,370,64,"",31,"F3");
  6169.         if (play||rep_b==2) draw_sprite(buff,28,394,70,0);
  6170.         if (rep_b==3) draw_m_butt(buff,447,64,GetTEXT( DONE_TEXT ),31,"F4");
  6171.         }
  6172.     }
  6173.  
  6174.  
  6175. void 
  6176. do_goal_menu(int team, int player, int time)
  6177.     {
  6178.     mdata1=team;
  6179.     mdata2=player;
  6180.     mdata3=time;
  6181.     slco=0;
  6182.     slide=oslide=44;
  6183.     mcount=240;
  6184.     if (menu) rdmenu=1;
  6185.     menu=1;
  6186.     }
  6187.  
  6188. void 
  6189. do_booked_menu(int team, int player)
  6190.     {
  6191.     mdata1=team;
  6192.     mdata2=player;
  6193.     slco=0;
  6194.     slide=oslide=44;
  6195.     mcount=240;
  6196.     if (menu) rdmenu=1;
  6197.     menu=2;
  6198.     }
  6199.  
  6200. void 
  6201. do_off_menu(int team, int player)
  6202.     {
  6203.     mdata1=team;
  6204.     mdata2=player;
  6205.     slco=0;
  6206.     slide=oslide=44;
  6207.     mcount=240;
  6208.     if (menu) rdmenu=1;
  6209.     menu=3;
  6210.     }
  6211.  
  6212. void 
  6213. do_direct_menu(int team)
  6214.     {
  6215.     mdata1=team;
  6216.     slco=0;
  6217.     slide=oslide=44;
  6218.     mcount=240;
  6219.     if (menu) rdmenu=1;
  6220.     menu=4;
  6221.     }
  6222.  
  6223. void 
  6224. do_indirect_menu(int team)
  6225.     {
  6226.     mdata1=team;
  6227.     slco=0;
  6228.     slide=oslide=44;
  6229.     mcount=240;
  6230.     if (menu) rdmenu=1;
  6231.     menu=5;
  6232.     }
  6233.  
  6234. void 
  6235. do_penalty_menu(int team)
  6236.     {
  6237.     mdata1=team;
  6238.     slco=0;
  6239.     slide=oslide=44;
  6240.     mcount=240;
  6241.     if (menu) rdmenu=1;
  6242.     menu=6;
  6243.     }
  6244.  
  6245. void 
  6246. do_corner_menu(int team)
  6247.     {
  6248.     mdata1=team;
  6249.     slco=0;
  6250.     slide=oslide=44;
  6251.     mcount=240;
  6252.     if (menu) rdmenu=1;
  6253.     menu=7;
  6254.     }
  6255.  
  6256. void 
  6257. do_throw_menu(int team)
  6258.     {
  6259.     mdata1=team;
  6260.     slco=0;
  6261.     slide=oslide=44;
  6262.     mcount=240;
  6263.     if (menu) rdmenu=1;
  6264.     menu=8;
  6265.     }
  6266.  
  6267. void 
  6268. do_goalkick_menu(int team)
  6269.     {
  6270.     mdata1=team;
  6271.     slco=0;
  6272.     slide=oslide=44;
  6273.     mcount=240;
  6274.     if (menu) rdmenu=1;
  6275.     menu=9;
  6276.     }
  6277.  
  6278. void 
  6279. do_kickoff_menu(int team)
  6280.     {
  6281.     mdata1=team;
  6282.     slco=0;
  6283.     slide=oslide=44;
  6284.     mcount=240;
  6285.     if (menu) rdmenu=1;
  6286.     menu=10;
  6287.     }
  6288.  
  6289. void 
  6290. do_offside_menu(int team)
  6291.     {
  6292.     mdata1=team;
  6293.     slco=0;
  6294.     slide=oslide=44;
  6295.     mcount=240;
  6296.     if (menu) rdmenu=1;
  6297.     menu=11;
  6298.     }
  6299.  
  6300. void 
  6301. do_injured_menu(int team, int player)
  6302.     {
  6303.     mdata1=team;
  6304.     mdata2=player;
  6305.     slco=0;
  6306.     slide=oslide=44;
  6307.     mcount=240;
  6308.     if (menu) rdmenu=1;
  6309.     menu=12;
  6310.     }
  6311.  
  6312. void 
  6313. do_fulltime_menu()
  6314.     {
  6315.     slco=0;
  6316.     slide=oslide=108;
  6317.     mcount=240000;
  6318.     if (menu) rdmenu=1;
  6319.     menu=13;
  6320.     mhgt=128;
  6321.     }
  6322.  
  6323. void 
  6324. do_extratime_menu()
  6325.     {
  6326.     slco=0;
  6327.     slide=oslide=108;
  6328.     mcount=240000;
  6329.     if (menu) rdmenu=1;
  6330.     menu=14;
  6331.     mhgt=128;
  6332.     }
  6333.  
  6334. void 
  6335. do_halftime_menu()
  6336.     {
  6337.     slco=0;
  6338.     slide=oslide=108;
  6339.     mcount=240000;
  6340.     if (menu) rdmenu=1;
  6341.     menu=15;
  6342.     mhgt=128;
  6343.     }
  6344.  
  6345. void 
  6346. do_penalty_shootout_menu()
  6347.     {
  6348.     slco=0;
  6349.     slide=oslide=108;
  6350.     mcount=340;
  6351.     if (menu) rdmenu=1;
  6352.     menu=16;
  6353.     mhgt=128;
  6354.     }
  6355.  
  6356. void 
  6357. do_final_score_menu()
  6358.     {
  6359.     slco=0;
  6360.     slide=oslide=108;
  6361.     mcount=240;
  6362.     if (menu) rdmenu=1;
  6363.     menu=17;
  6364.     mhgt=128;
  6365.     }
  6366.  
  6367. void 
  6368. do_owngoal_menu(int team, int player, int time)
  6369.     {
  6370.     mdata1=team;
  6371.     mdata2=player;
  6372.     mdata3=time;
  6373.     slco=0;
  6374.     slide=oslide=44;
  6375.     mcount=240;
  6376.     if (menu) rdmenu=1;
  6377.     menu=18;
  6378.     }
  6379.  
  6380. void 
  6381. do_options_menu(int team,int user_no)
  6382.     {
  6383.     mdata1=team;
  6384.     mdata2=user_no+1;
  6385.     slco=0;
  6386.     slide=oslide=108;
  6387.     mcount=1000000;
  6388.     if (menu) rdmenu=1;
  6389.     menu=19;
  6390.     }
  6391.  
  6392. void 
  6393. do_formation_menu(int team,int user_no)
  6394.     {
  6395.     mdata1=team;
  6396.     mdata2=user_no+1;
  6397.     slco=0;
  6398.     slide=oslide=92;
  6399.     mcount=1000000;
  6400.     if (menu) rdmenu=1;
  6401.     menu=20;
  6402.     }
  6403.  
  6404. void 
  6405. do_substitution_menu(int team,int user_no)
  6406.     {
  6407.     mdata1=team;
  6408.     mdata2=user_no+1;
  6409.     slco=0;
  6410.     slide=oslide=108;
  6411.     mcount=1000000;
  6412.     if (menu) rdmenu=1;
  6413.     menu=21;
  6414.     }
  6415.  
  6416. void 
  6417. do_replay_menu(int user_no)
  6418.     {
  6419.     mdata1=user_no+1;
  6420.     slco=0;
  6421.     slide=oslide=34;
  6422.     mcount=1000000;
  6423.     if (menu) rdmenu=1;
  6424.     menu=22;
  6425.     }
  6426.  
  6427. void 
  6428. do_ref_menu()
  6429.     {
  6430.     slco=0;
  6431.     slide=oslide=44;
  6432.     mcount=240;
  6433.     if (menu) rdmenu=1;
  6434.     menu=23;
  6435.     }
  6436.  
  6437. void 
  6438. do_stats_menu()
  6439.     {
  6440.     slco=0;
  6441.     slide=oslide=140;
  6442.     mcount=200*6;
  6443.     if (menu) rdmenu=1;
  6444.     menu=24;
  6445.     }
  6446.  
  6447.  
  6448. struct user_vectors{
  6449.     float x;
  6450.     float y;
  6451.     char m;
  6452.     char f;
  6453.     };
  6454.  
  6455. extern user_vectors users_dir[20];
  6456. extern void convert_inputs();
  6457. #ifndef LINK
  6458. extern void get_user_inputs();
  6459. extern void process_user_inputs();
  6460. extern volatile int readptr;
  6461. extern volatile int writeptr;
  6462. #else
  6463. extern "C" void get_user_inputs();
  6464. extern "C" void process_user_inputs();
  6465. extern "C" volatile int readptr;
  6466. extern "C" volatile int writeptr;
  6467. #endif
  6468.  
  6469. #define RIGHT_DIR 1
  6470. #define LEFT_DIR 2
  6471. #define DOWN_DIR 4
  6472. #define UP_DIR 8
  6473. #define FIRE1_DIR 16
  6474. #define FIRE2_DIR 32
  6475. #define F1_DIR 64
  6476. #define F2_DIR 128
  6477. #define F3_DIR 256
  6478. #define F4_DIR 512
  6479. #define BUTT_WAIT 65
  6480. static int count_ur;
  6481. static int count_ul;
  6482. static int count_ud;
  6483. static int count_uu;
  6484. static int count_uf1;
  6485. static int count_uf2;
  6486. static int uf1_p;
  6487. static int uf2_p;
  6488. static int uf3_p;
  6489. static int uf4_p;
  6490. int
  6491. get_dir(int user_no)
  6492.     {
  6493.     int out;
  6494. #ifdef LINK
  6495.     if (user_no>=0)
  6496.         {
  6497.         icth=32767;
  6498.         isth=0;
  6499.         get_user_inputs();
  6500.         process_user_inputs();
  6501.         writeptr++;
  6502.         writeptr&=511;
  6503.         convert_inputs();
  6504.         readptr++;
  6505.         readptr&=511;
  6506.         }
  6507.     else
  6508. #endif
  6509.         {
  6510.         users_dir[0].x=0;
  6511.         users_dir[0].y=0;
  6512.         users_dir[0].f=0;
  6513. #ifdef LINK
  6514.         if (keys[0xcd]) users_dir[0].x=1;
  6515.         if (keys[0xcb]) users_dir[0].x=-1;
  6516.         if (keys[0xd0]) users_dir[0].y=1;
  6517.         if (keys[0xc8]) users_dir[0].y=-1;
  6518. #else
  6519.         if (keys[0x4d]) users_dir[0].x=1;
  6520.         if (keys[0x4b]) users_dir[0].x=-1;
  6521.         if (keys[0x50]) users_dir[0].y=1;
  6522.         if (keys[0x48]) users_dir[0].y=-1;
  6523. #endif
  6524.         if (keys[0x52]) users_dir[0].f=1;
  6525.         if (keys[0x53]) users_dir[0].f=1;
  6526.         user_no=0;
  6527.         }
  6528.  
  6529.     out=0;
  6530.     if (users_dir[user_no].x>0.1) 
  6531.         {if (count>count_ur+50) out|=RIGHT_DIR,count_ur=count+100;}
  6532.     else
  6533.         if (users_dir[user_no].x<-0.1)
  6534.             {if (count>count_ul+50) out|=LEFT_DIR,count_ul=count+100;}
  6535.         else
  6536.             count_ul=count_ur=0;
  6537.     if (users_dir[user_no].y>0.1) 
  6538.         {if (count>count_ud+50) out|=DOWN_DIR,count_ud=count+100;}
  6539.     else
  6540.         if (users_dir[user_no].y<-0.1)
  6541.             {if (count>count_uu+50) out|=UP_DIR,count_uu=count+100;}
  6542.         else
  6543.             count_uu=count_ud=0;
  6544.     if (users_dir[user_no].f&1)
  6545.             {if (count>count_uf1+50) out|=FIRE1_DIR,count_uf1=count+100;}
  6546.         else
  6547.             count_uf1=0;
  6548.     if (users_dir[user_no].f&2)
  6549.             {if (count>count_uf2+50) out|=FIRE2_DIR,count_uf2=count+100;}
  6550.         else
  6551.             count_uf2=0;
  6552.     if (!keys[0x3b]) uf1_p=0; else if (!uf1_p) out|=F1_DIR|FIRE1_DIR,uf1_p=1;
  6553.     if (!keys[0x3c]) uf2_p=0; else if (!uf2_p) out|=F2_DIR|FIRE1_DIR,uf2_p=1;
  6554.     if (!keys[0x3d]) uf3_p=0; else if (!uf3_p) out|=F3_DIR|FIRE1_DIR,uf3_p=1;
  6555.     if (!keys[0x3e]) uf4_p=0; else if (!uf4_p) out|=F4_DIR|FIRE1_DIR,uf4_p=1;
  6556.  
  6557.     return(out);
  6558.     }
  6559.  
  6560.  
  6561. extern void do_replay_render3d(float pos);
  6562. extern void setup_replay();
  6563. extern void reset_replay();
  6564. extern void frame_count();
  6565.  
  6566. void
  6567. replay(buff_info *buffer,datapt viewx,datapt viewy,datapt viewz,datapt targx,datapt targy,
  6568.         datapt targz,datapt vdist,plyrdat *plyrtb,datapt *xyz_ptr,word *ref_ptr,int user_no)
  6569.     {
  6570.     int dir,repcount;
  6571.     float repstep;
  6572.     rep_b=3;
  6573.     uf1_p=uf2_p=uf3_p=uf4_p=1;
  6574.     play=1;
  6575.     speed=5;
  6576.     reppos=0;
  6577.     setup_replay();
  6578.     do_replay_menu(user_no);
  6579.     do
  6580.         {
  6581.         render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6582.         main_buff.dump(0,0);
  6583.         frame_count();
  6584.         } while (slide>0);
  6585.     do
  6586.         {
  6587.         dir=get_dir(user_no);
  6588.         if (dir&F1_DIR) rep_b=0;
  6589.         if (dir&F2_DIR) rep_b=1;
  6590.         if (dir&F3_DIR) rep_b=2;
  6591.         if (dir&F4_DIR) rep_b=3;
  6592.         if (dir&LEFT_DIR) (rep_b+=3)%=4;
  6593.         if (dir&RIGHT_DIR) ++rep_b%=4;
  6594.         repcount=count;
  6595.         do_replay_render3d(reppos);
  6596.         frame_count();
  6597. #ifndef LINK
  6598.         render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6599.         main_buff.dump(0,0);
  6600. #endif
  6601.         repstep=(count-repcount)/200.;
  6602.         if (dir&(FIRE1_DIR|FIRE2_DIR))
  6603.             {
  6604.             switch(rep_b)
  6605.                 {
  6606.                 case 0:
  6607.                     if (speed>0) --speed;
  6608.                     break;
  6609.                 case 1:
  6610.                     if (speed<5) ++speed;
  6611.                     break;
  6612.                 case 2:
  6613.                     if (speed)
  6614.                         play=!play;
  6615.                     else
  6616.                         reppos+=repstep*3/5.;
  6617.                     break;
  6618.                 case 3:
  6619.                     goto re_exit;
  6620.                 }
  6621.             }
  6622.             if (play) reppos+=repstep*speed/5.;
  6623.             if (reppos>=replay_seconds) reppos=0,play=0;
  6624.         } while (!keys[1]);
  6625.     keys[1]=0;
  6626.     re_exit:;
  6627.     if (user_no>=0) 
  6628.         while (users_dir[user_no].f&3)
  6629.             get_dir(user_no);
  6630.     keys[0x3b]=keys[0x3c]=keys[0x3d]=keys[0x3e]=0;
  6631.     reset_replay();
  6632.     mcount=1;
  6633.     }
  6634.  
  6635. extern void    SubstituePlayers(int team_no, int player1, int player2);
  6636. extern void    sub_player(short team_no, short player1, short player2);
  6637.  
  6638. char sub_pending;
  6639. int sub_p_a,sub_p_b;
  6640.  
  6641. void
  6642. substitution(buff_info *buffer,datapt viewx,datapt viewy,datapt viewz,datapt targx,datapt targy,
  6643.         datapt targz,datapt vdist,plyrdat *plyrtb,datapt *xyz_ptr,word *ref_ptr,int team)
  6644.     {
  6645.     int dir;
  6646.     int user_no;
  6647.     user_no=(team==0)?sub_p_a:sub_p_b;
  6648.     option_info.sub_off=0;
  6649.     option_info.sub_on=11;
  6650.     while (game_data[(team==0)?TEMPa:TEMPb].players[option_info.sub_off].flags&2)
  6651.         option_info.sub_off++;
  6652.     while (!game_data[(team==0)?TEMPa:TEMPb].players[option_info.sub_on].flags&1)
  6653.         option_info.sub_on++;
  6654.     sub_b=0;
  6655.     uf1_p=uf2_p=uf3_p=uf4_p=1;
  6656.     do_substitution_menu(team, user_no);
  6657.     do
  6658.         {
  6659.         render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6660.         main_buff.dump(0,0);
  6661.         frame_count();
  6662.         } while (slide>0);
  6663.     do
  6664.         {
  6665.         dir=get_dir(user_no);
  6666.         if (dir&F1_DIR) sub_b=0;
  6667.         if (dir&F2_DIR) sub_b=1;
  6668.         if (dir&F3_DIR) sub_b=2;
  6669.         if (dir&F4_DIR) sub_b=3;
  6670.         if (dir&UP_DIR) (sub_b+=3)%=4;
  6671.         if (dir&DOWN_DIR) ++sub_b%=4;
  6672.         render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6673.         main_buff.dump(0,0);
  6674.         frame_count();
  6675.         if (dir&(FIRE1_DIR|FIRE2_DIR))
  6676.             {
  6677.             switch(sub_b)
  6678.                 {
  6679.                 case 0:
  6680.                     do
  6681.                         {
  6682.                         if (dir&FIRE1_DIR) (++option_info.sub_off%=11);
  6683.                         else (option_info.sub_off+=10)%=11;
  6684.                         } while (game_data[(team==0)?TEMPa:TEMPb].players[option_info.sub_off].flags&2);
  6685.                     break;
  6686.                 case 1:
  6687.                     sub_player(team,option_info.sub_off,option_info.sub_on);
  6688.                     SubstituePlayers((team==0)?setup.team_a:setup.team_b,option_info.sub_off,option_info.sub_on);
  6689.                     goto su_exit;
  6690.                 case 2:
  6691.                     goto su_exit;
  6692.                 case 3:
  6693.                     do
  6694.                         {
  6695.                         if (dir&FIRE1_DIR) { if (++option_info.sub_on>14) option_info.sub_on=11; }
  6696.                         else { if (--option_info.sub_on<11) option_info.sub_on=14; }
  6697.                         } while (!game_data[(team==0)?TEMPa:TEMPb].players[option_info.sub_on].flags&1);
  6698.                     break;
  6699.                 }
  6700.             }
  6701.         } while (!keys[1]);
  6702.     keys[1]=0;
  6703.     su_exit:;
  6704.     if (user_no>=0) 
  6705.         while (users_dir[user_no].f&3)
  6706.             get_dir(user_no);
  6707.     keys[0x3b]=keys[0x3c]=keys[0x3d]=keys[0x3e]=0;
  6708.     sub_pending&=((team==0)?2:1);
  6709.     mcount=1;
  6710.     }
  6711.  
  6712. extern char tactics_a,tactics_b;
  6713. extern void load_new_tactics();
  6714.  
  6715. void
  6716. formation(buff_info *buffer,datapt viewx,datapt viewy,datapt viewz,datapt targx,datapt targy,
  6717.         datapt targz,datapt vdist,plyrdat *plyrtb,datapt *xyz_ptr,word *ref_ptr,int user_no,int team)
  6718.     {
  6719.     int dir;
  6720.     int oform=option_info.formation;
  6721.     for_b=0;
  6722.     uf1_p=uf2_p=uf3_p=uf4_p=1;
  6723.     do_formation_menu(team, user_no);
  6724.     do
  6725.         {
  6726.         render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6727.         main_buff.dump(0,0);
  6728.         frame_count();
  6729.         } while (slide>0);
  6730.     do
  6731.         {
  6732.         dir=get_dir(user_no);
  6733.         if (dir&F1_DIR) for_b=0;
  6734.         if (dir&F2_DIR) for_b=1;
  6735.         if (dir&F3_DIR) for_b=2;
  6736.         if (dir&UP_DIR) (for_b+=2)%=3;
  6737.         if (dir&DOWN_DIR) ++for_b%=3;
  6738.         render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6739.         main_buff.dump(0,0);
  6740.         frame_count();
  6741.         if (dir&(FIRE1_DIR|FIRE2_DIR))
  6742.             {
  6743.             switch(for_b)
  6744.                 {
  6745.                 case 0:
  6746.                     if (dir&FIRE1_DIR) (++option_info.formation%=10);
  6747.                     else (option_info.formation+=9)%=10;
  6748.                     break;
  6749.                 case 1:
  6750.                     if (team==0) tactics_a=option_info.formation;
  6751.                     else tactics_b=option_info.formation;
  6752.                     load_new_tactics();
  6753.                     goto fo_exit;
  6754.                 case 2:
  6755.                     option_info.formation=oform;
  6756.                     goto fo_exit;
  6757.                 }
  6758.             }
  6759.         } while (!keys[1]);
  6760.     keys[1]=0;
  6761.     if (user_no>=0) 
  6762.         while (users_dir[user_no].f&3)
  6763.             get_dir(user_no);
  6764.     keys[0x3b]=keys[0x3c]=keys[0x3d]=keys[0x3e]=0;
  6765.     fo_exit:;
  6766.     mcount=1;
  6767.     }
  6768.  
  6769. void
  6770. options(buff_info *buffer,datapt viewx,datapt viewy,datapt viewz,datapt targx,datapt targy,
  6771.         datapt targz,datapt vdist,plyrdat *plyrtb,datapt *xyz_ptr,word *ref_ptr,int user_no,int team)
  6772.     {
  6773.     int dir;
  6774.     opt_b=0;
  6775.     uf1_p=uf2_p=uf3_p=uf4_p=1;
  6776.     if (replay_seconds==0||!allow_replay) opt_b=3;
  6777.     if (user_no<0)
  6778.         {
  6779.         if (replay_seconds==0||!allow_replay) return;
  6780.         sub_c=0;
  6781.         }
  6782.     else
  6783.         {
  6784.         sub_c=(game_data[(team==0)?TEMPa:TEMPb].players[11].flags&1);
  6785.         sub_c+=(game_data[(team==0)?TEMPa:TEMPb].players[12].flags&1);
  6786.         sub_c+=(game_data[(team==0)?TEMPa:TEMPb].players[13].flags&1);
  6787.         sub_c+=(game_data[(team==0)?TEMPa:TEMPb].players[14].flags&1);
  6788.         }
  6789.     option_info.formation=(team==0)?tactics_a:tactics_b;
  6790.     op_loop:
  6791.     do_options_menu(team, user_no);
  6792.     do
  6793.         {
  6794.         render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6795.         main_buff.dump(0,0);
  6796.         frame_count();
  6797.         } while (slide>0);
  6798.     do
  6799.         {
  6800.         dir=get_dir(user_no);
  6801.         if (dir&F1_DIR) if (replay_seconds==0||!allow_replay) dir^=FIRE1_DIR; else opt_b=0;
  6802.         if (dir&F2_DIR) if (match_mode||!EUROmatch_info.substitutes||sub_c<2) dir^=FIRE1_DIR; else opt_b=1;
  6803.         if (dir&F3_DIR) if (user_no<0) dir^=FIRE1_DIR; else opt_b=2;
  6804.         if (dir&F4_DIR) opt_b=3;
  6805.         re_opt:;
  6806.         if (dir&UP_DIR) 
  6807.             {
  6808.             if (user_no<0 && opt_b==3) { opt_b=2;goto re_opt; }
  6809.             if ((match_mode||!EUROmatch_info.substitutes||sub_c<2) && opt_b==2) { opt_b=1;goto re_opt; }
  6810.             if ((replay_seconds==0||!allow_replay) && opt_b==1) { opt_b=0;goto re_opt; }
  6811.             (opt_b+=3)%=4;
  6812.             }
  6813.         if (dir&DOWN_DIR)
  6814.             {
  6815.             if (user_no<0 && opt_b==1) { opt_b=2;goto re_opt; }
  6816.             if ((match_mode||!EUROmatch_info.substitutes||sub_c<2) && opt_b==0) { opt_b=1;goto re_opt; }
  6817.             if ((replay_seconds==0||!allow_replay) && opt_b==3) { opt_b=0;goto re_opt; }
  6818.             ++opt_b%=4;
  6819.             }
  6820.         render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6821.         main_buff.dump(0,0);
  6822.         frame_count();
  6823.         if (dir&(FIRE1_DIR|FIRE2_DIR))
  6824.             {
  6825.             switch(opt_b)
  6826.                 {
  6827.                 case 0:
  6828.                     replay(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr,user_no);
  6829.                     goto op_exit;
  6830.                 case 1:
  6831.                     if (team==0)
  6832.                         {
  6833.                         sub_pending^=1;
  6834.                         sub_p_a=user_no;
  6835.                         }
  6836.                     else
  6837.                         {
  6838.                         sub_pending^=2;
  6839.                         sub_p_b=user_no;
  6840.                         }
  6841. //                    substitution(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr,user_no,team);
  6842.                       goto op_exit;
  6843.                 case 2:
  6844.                     formation(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr,user_no,team);
  6845.                     if (for_b==2)
  6846.                         goto op_loop;
  6847.                     else
  6848.                         goto op_exit;
  6849.                 case 3:
  6850.                     goto op_exit;
  6851.                 }
  6852.             }
  6853.         } while (!keys[1]);
  6854.     keys[1]=0;
  6855.     op_exit:;
  6856.     if (user_no>=0) 
  6857.         while (users_dir[user_no].f&3)
  6858.             get_dir(user_no);
  6859.     keys[0x3b]=keys[0x3c]=keys[0x3d]=keys[0x3e]=0;
  6860.     mcount=1;
  6861.     }
  6862.  
  6863. void
  6864. adjust_menu()
  6865.     {
  6866.     menu_buff_l[menu-1].buff_hgt=menu_buff_l[menu-1].clip_hgt=mhgt;
  6867.     menu_buff_h[menu-1].buff_hgt=menu_buff_h[menu-1].clip_hgt=mhgt<<1;
  6868.     menu_buff_l[menu-1].buff_start=MCGA_buff[0].buff_start+(MCGA_buff[0].clip_hgt-menu_buff_l[menu-1].buff_hgt)*MCGA_buff[0].buff_wid+((MCGA_buff[0].clip_wid-menu_buff_l[menu-1].clip_wid)>>1);
  6869.     menu_buff_h[menu-1].buff_start=VESA_buff[scrmode-0x100][0].buff_start+(VESA_buff[scrmode-0x100][0].clip_hgt-menu_buff_h[menu-1].buff_hgt)*VESA_buff[scrmode-0x100][0].buff_wid+((VESA_buff[scrmode-0x100][0].clip_wid-menu_buff_h[menu-1].clip_wid)>>1);
  6870.     if (scrmode3DB>=0) 
  6871.         {
  6872.         if (scrmode3DB>1)
  6873.             menu_buff_l[menu-1].buff_start=buff_3DB[scrmode3DB].buff_start+(buff_3DB[scrmode3DB].clip_hgt-menu_buff_l[menu-1].buff_hgt)*buff_3DB[scrmode3DB].buff_wid+((buff_3DB[scrmode3DB].clip_wid-menu_buff_l[menu-1].clip_wid)>>1);
  6874.         else
  6875.             menu_buff_h[menu-1].buff_start=buff_3DB[scrmode3DB].buff_start+(buff_3DB[scrmode3DB].clip_hgt-menu_buff_h[menu-1].buff_hgt)*buff_3DB[scrmode3DB].buff_wid+((buff_3DB[scrmode3DB].clip_wid-menu_buff_h[menu-1].clip_wid)>>1);
  6876.         }
  6877.     if (slide>mhgt-20) slide=oslide=mhgt-20;
  6878.     }
  6879.  
  6880.  
  6881. // Remapping gfx for transparency
  6882. remapgfx(int d)
  6883.     {
  6884.     BYTE *tptr;
  6885.     int i;
  6886.     tptr=maps[0];
  6887.     for (i=0;i<X_BM*65536;i++) *(tptr++)+=d;
  6888.     if (setup.M8)
  6889.         {
  6890.         tptr=maps[S_BM+2];
  6891. #ifdef NEW
  6892.         for (i=0;i<6*65536;i++) *(tptr++)+=d;
  6893. #else
  6894.         for (i=0;i<5*65536;i++) *(tptr++)+=d;
  6895. #endif
  6896.         }
  6897.     }
  6898.  
  6899. remapxgfx(int d)
  6900.     {
  6901.     BYTE *tptr;
  6902.     int i,j;
  6903.     tptr=maps[X_BM];
  6904.     for (i=0;i<116*256;i++) *(tptr++)+=d;
  6905.     for (i=116;i<143;i++)
  6906.         {
  6907.         tptr+=256-188;
  6908.         for (j=0;j<188;j++) 
  6909.             *(tptr++)+=d;
  6910.         }
  6911.     for (i=143;i<171;i++) 
  6912.         {
  6913.         tptr+=256-79;
  6914.         for (j=0;j<79;j++) 
  6915.             *(tptr++)+=d;
  6916.         }
  6917.     tptr=maps[X_BM]+180*256;
  6918.     for (i=0;i<(76+256)*256;i++) 
  6919.         {
  6920.         if (*tptr>1) *(tptr)+=d;
  6921.         tptr++;
  6922.         }
  6923.     if (setup.stadium>=45&&setup.stadium<90)
  6924.         {
  6925.         tptr=maps[S_BM]+100*256+197;
  6926.         for (j=0;j<90;j++)
  6927.             {
  6928.             for (i=0;i<59;i++)
  6929.                 *(tptr++)+=d;
  6930.             tptr+=256-59;
  6931.             }
  6932.         tptr=maps[S_BM]+190*256+220;
  6933.         for (j=0;j<35;j++)
  6934.             {
  6935.             for (i=0;i<36;i++)
  6936.                 *(tptr++)+=d;
  6937.             tptr+=256-36;
  6938.             }
  6939.         }
  6940.     tptr=maps[X_BM+1]+80*256;
  6941.     for (i=0;i<256;i++) 
  6942.         *tptr++=i;
  6943.     }
  6944.  
  6945.  
  6946. extern int coo;
  6947. double null;
  6948. obj hd;
  6949. ptlist hdp={ 4, -50,0,-50, 50,0,-50, 50,0,50, -50,0,50 };
  6950. facelist hdf={ 1, 4,-X_TM-2000, 0,3,2,1};
  6951.  
  6952.  
  6953. /************************/
  6954. /* MAIN DISPLAY ROUTINE */
  6955.  
  6956. void render3d(buff_info *buffer,datapt viewx,datapt viewy,datapt viewz,datapt targx,datapt targy,
  6957.               datapt targz,datapt vdist,plyrdat *plyrtb,datapt *xyz_ptr,word *ref_ptr)
  6958.     {
  6959.     short i,j;
  6960.     double hr,r;
  6961.     mat tmp;
  6962.     obj *thisobj;
  6963.     objs *oldobj;
  6964.     plyrdat *plyrpt;
  6965.     plyrtwdat *plyrpto;
  6966.     mcap *mc1,*mc2;
  6967.     datapt *tw,*tw1,*tw2;
  6968.     floatpt twnstp,pt1,pt2;
  6969.     short plyrhi;
  6970.     static char vidi_l;
  6971.     static short balld;
  6972.     short an,ano,xf,xfo;
  6973.     static short kco=0;
  6974.     static short wire=0;
  6975.     static float hcoo=0;
  6976.     static float fcoo=0;
  6977.     float fs,fx,fy;
  6978.     BYTE v,ra,rb,*vrnd;
  6979.  
  6980.     rotpt rxa[4],rya[4],rza[4];
  6981.     rotpt rxb[4],ryb[4],rzb[4];
  6982.     float dx1,dy1,dx2,dy2,dz1,dz2;
  6983.     float vn,vm,vs1,vs2,vs3,vs4;
  6984.  
  6985.     if (vidi_anim&&buffer==&vidi_buff) return;
  6986.  
  6987.     if (!kco&buffer!=&vidi_buff)
  6988.         {
  6989.  
  6990.         if (keys[0x44]&&setup.M8)
  6991.             {
  6992.             short oscrmode;
  6993.             oscrmode=scrmode;
  6994.             switchmode();
  6995.             if (scrmode3DB<0 && scrmode!=oscrmode)
  6996.                 {
  6997.                 ++setup.start_res&=1;
  6998.                 switch(scrmode)
  6999.                     {
  7000.                     case 0x13:
  7001.                         vclear(scrb+320,320,200,320,5);
  7002.                         mcgacpy(scrb+320,0,0,320,200,320);
  7003.                         break;
  7004.                     case 0x100:
  7005.                         vclear(scrb+640,640,400,640,5);
  7006.                         svgacpy(scrb+640,0,0,640,400,640);
  7007.                         break;
  7008.                     case 0x101:
  7009.                         vclear(scrb+640,640,480,640,5);
  7010.                         svgacpy(scrb+640,0,0,640,480,640);
  7011.                         break;
  7012.                     }
  7013.                 }
  7014.                 else
  7015. #ifdef BLASTDEMO
  7016.                     scrmode=(setup.start_res=(scrmode3DB>1)?1:0)?0x100:0x13;
  7017. #else
  7018.                     scrmode=(setup.start_res=(scrmode3DB>0)?1:0)?0x100:0x13;
  7019. #endif
  7020.             kco=8;
  7021.             }
  7022.  
  7023.         if (keys[0xc]&&setup.screen_size<SCRSIZES-1&&scrmode3DB<0)
  7024.             {
  7025.             clearbuffer(buffer,5);
  7026. //            buffer->dump(0,0);
  7027.             rdmenu=1;
  7028.             setup.screen_size++;
  7029.             if (scrmode==0x13)
  7030.                 *buffer=main_buff=MCGA_buff[setup.screen_size];
  7031.             else
  7032.                 {
  7033.                 i=0;
  7034.                 while (scrmode!=modelist[i] && ++i!=VESAMODES);
  7035.                 if (i!=VESAMODES)
  7036.                     *buffer=main_buff=VESA_buff[i][setup.screen_size];
  7037.                 }
  7038.             kco=8;
  7039.             }
  7040.  
  7041.         if (keys[0xd]&&setup.screen_size>0)
  7042.             {
  7043.             clearbuffer(buffer,5);
  7044. //            buffer->dump(0,0);
  7045.             rdmenu=1;
  7046.             setup.screen_size--;
  7047.             if (scrmode==0x13)
  7048.                 *buffer=main_buff=MCGA_buff[setup.screen_size];
  7049.             else
  7050.                 {
  7051.                 i=0;
  7052.                 while (scrmode!=modelist[i] && ++i!=VESAMODES);
  7053.                 if (i!=VESAMODES)
  7054.                     *buffer=main_buff=VESA_buff[i][setup.screen_size];
  7055.                 }
  7056.             kco=8;
  7057.             }
  7058.  
  7059. #ifdef BLASTDEMO
  7060.         if (keys[0x0e])
  7061.             {
  7062.             if (scrmode3DB<0)
  7063.                 {
  7064.                 if ((scrmode3DB=Init3DB(setup.start_res==0?modelist3DB:modelist3DBh))>=0)
  7065.                     {
  7066. #ifdef BLASTDEMO
  7067.                     scrmode=(setup.start_res=(scrmode3DB>1)?1:0)?0x100:0x13;
  7068. #else
  7069.                     scrmode=(setup.start_res=(scrmode3DB>0)?1:0)?0x100:0x13;
  7070. #endif
  7071.                     remapgfx(-1);
  7072.                     remapxgfx(-1);
  7073.                     main_buff=buff_3DB[scrmode3DB];
  7074.                     pal[3]=pal[4]=pal[5]=63;
  7075.                     pal[191*3]=pal[191*3+1]=pal[191*3+2]=0;
  7076.                     SetPalette3DB(pal);
  7077.                     }
  7078.                 }
  7079.             else
  7080.                 {
  7081.                 Close3DB();
  7082.                 scrmode3DB=-1;
  7083.                 remapgfx(1);
  7084.                 remapxgfx(1);
  7085.                 if (setup.start_res==0)
  7086.                     {
  7087.                     scrmode=0x13;
  7088.                     VGAmode(scrmode);
  7089.                     main_buff=MCGA_buff[setup.screen_size];
  7090.                     }
  7091.                 else
  7092.                     {
  7093.                     testVESA=0;
  7094.                     scrmode=VESAmode(&modelist[0]);
  7095.                     switch(scrmode)
  7096.                         {
  7097.                         case 0x100:main_buff=VESA_buff[0][setup.screen_size];break;
  7098.                         case 0x101:main_buff=VESA_buff[1][setup.screen_size];break;
  7099.                         default:VGAmode(0x13);main_buff=MCGA_buff[setup.screen_size];scrmode=0x13;
  7100.                         }
  7101.                     }
  7102.         
  7103.                 setup.start_res=(scrmode==0x13)?0:1;
  7104.         
  7105.                 // Set palette
  7106.                 setpal();
  7107.         
  7108.                 // Clear screen
  7109.                 switch(scrmode)
  7110.                     {
  7111.                     case 0x13:
  7112.                         vclear(scrb+320,320,200,320,5);
  7113.                         mcgacpy(scrb+320,0,0,320,200,320);
  7114.                         break;
  7115.                     case 0x100:
  7116.                         vclear(scrb+640,640,400,640,5);
  7117.                         svgacpy(scrb+640,0,0,640,400,640);
  7118.                         break;
  7119.                     case 0x101:
  7120.                         vclear(scrb+640,640,480,640,5);
  7121.                         svgacpy(scrb+640,0,0,640,480,640);
  7122.                         break;
  7123.                     }
  7124.                 }
  7125.             kco=8;
  7126.             }
  7127. #endif
  7128.  
  7129.         if (scrmode3DB<0)
  7130.             {
  7131.             if (keys[0x3f]) ++setup.detail.pitch%=3,kco=8;
  7132.             if (setup.detail.pitch==0&&setup.start_res==1) setup.detail.pitch=1;
  7133.             if (keys[0x40]) ++setup.detail.lines&=1,kco=8;
  7134.             if (keys[0x41]) ++setup.detail.sky&=1,kco=8;
  7135.             if (keys[0x42]) ++setup.detail.players&=1,kco=8;
  7136. //            if (keys[0x3f]) ++setup.detail.shadows&=1,kco=8;
  7137.  
  7138. //            if (keys[0x10])
  7139. //                wire=!wire,kco=8;
  7140.  
  7141.             if (EUROmatch_info.tga_enable&&keys[0x43]&&setup.M8)
  7142.                 {
  7143.                 for (i=0;i<400;i++)
  7144.                     memcpy(dumplbm+0x312+(399-i)*640,render_buff.buff_start+640*i,640);
  7145.                 writebin(dumpstr,dumplbm,640*400+0x312);
  7146.                 dumpstr[4]++;
  7147.                 kco=8;
  7148.                 }
  7149.             }
  7150.         }
  7151.     else
  7152.         if (kco&&buffer!=&vidi_buff) kco--;
  7153.  
  7154.     // Set extended buffer info
  7155.     render_buff.buff_start=buffer->buff_start;
  7156.     render_buff.buff_wid=buffer->buff_wid;
  7157.     render_buff.buff_hgt=buffer->buff_hgt;
  7158.     render_buff.clip_wid=buffer->clip_wid;
  7159.     render_buff.clip_hgt=buffer->clip_hgt;
  7160.     render_buff.scale_x=buffer->scale_x;
  7161.     render_buff.scale_y=buffer->scale_y;
  7162.     render_buff.dump=buffer->dump;
  7163.     render_buff.clip_endl=buffer->buff_start+buffer->clip_hgt*buffer->buff_wid;
  7164.     render_buff.clip_end=render_buff.clip_endl-buffer->buff_wid;
  7165.     render_buff.clip_widl=buffer->clip_wid-1;
  7166.     render_buff.clip_hgtl=buffer->clip_hgt-1;
  7167.     render_buff.clip_xmid=buffer->clip_wid>>1;
  7168.     render_buff.clip_ymid=buffer->clip_hgt>>1;
  7169.  
  7170.     // Set perspective based info
  7171.     oq=vdist;
  7172.     q=vdist*((buffer->scale_x+buffer->scale_y)/2);
  7173.     qr=(floatpt)1/q; 
  7174.     qa=(floatpt)q*2/100;
  7175.     scrdr=(float)1/SCREENDIST;
  7176.     persc=q*scrdr;
  7177.  
  7178.     // Prepare viewing vector vars
  7179.     viewz=-viewz,targz=-targz;
  7180.     targx-=viewx;
  7181.     targy-=viewy;
  7182.     targz-=viewz;
  7183.  
  7184.     hr=targx*targx+targz*targz;
  7185.     if (hr<1) hr=1,targz=1;
  7186.     r=sqrt(hr+targy*targy);
  7187.     hr=sqrt(hr);
  7188.     cth=targz/hr;sth=targx/hr;
  7189.     cph=hr/r;sph=targy/r;
  7190.     if (buffer!=&vidi_buff)
  7191.         {
  7192.         icth=32767*cth;
  7193.         isth=32767*sth;
  7194.         }
  7195.  
  7196.     // Make global rotation matrix
  7197.     matcop(rot.arr,unit);
  7198.     matcop(tran.arr,unit);
  7199.     matcop(tmp,unit);
  7200.     rot.arr[0][3]=-viewx;
  7201.     rot.arr[1][3]=-viewy;
  7202.       rot.arr[2][3]=-viewz;
  7203.     tmp[0][0]=cth;
  7204.     tmp[0][2]=-sth;                             
  7205.     tmp[1][0]=-sth*sph;
  7206.     tmp[1][1]=cph;
  7207.     tmp[1][2]=-cth*sph;
  7208.     tmp[2][0]=sth*cph;             
  7209.     tmp[2][1]=sph;
  7210.     tmp[2][2]=cth*cph;
  7211.     matmul(rot.arr,tmp);
  7212.  
  7213.     clip_tex=NOTEXTURES+1;
  7214.  
  7215.     ppt=plyrtb;
  7216.  
  7217. #ifdef COUNT
  7218.     numpols=0;     
  7219. #endif
  7220.  
  7221.  
  7222. //// Now render all objects from furthest to nearest
  7223.  
  7224.     clearlists
  7225.  
  7226.  
  7227. //// GRASS
  7228.  
  7229.     if (scrmode3DB<0)
  7230.         {
  7231.         ground(hr,targy,viewx,viewy,-viewz);
  7232.         if (!setup.detail.pitch)
  7233.             addobjfc(&pitch);
  7234.         }
  7235.     else
  7236.         {
  7237.         ground(hr,targy,viewx,viewy,-viewz);
  7238. //        addobjfc(&pitch);
  7239. //        dispols3DB();
  7240.         }
  7241.  
  7242. //goto hd1;
  7243.  
  7244. //// FAR STANDS
  7245.  
  7246.  
  7247.     vn=st_w*rot.e.r22+rot.e.r23;
  7248.     vs1=vn*rot.e.r00-(st_w*rot.e.r02+rot.e.r03)*rot.e.r20;
  7249.     vn=(-800-st_w)*rot.e.r22+rot.e.r23;
  7250.     vs2=vn*rot.e.r00-((-800-st_w)*rot.e.r02+rot.e.r03)*rot.e.r20;
  7251.  
  7252.     vn=-st_l*rot.e.r20+rot.e.r23;
  7253.     vs3=vn*rot.e.r02-(-st_l*rot.e.r00+rot.e.r03)*rot.e.r22;
  7254.     vn=(1280+st_l)*rot.e.r20+rot.e.r23;
  7255.     vs4=vn*rot.e.r02-((1280+st_l)*rot.e.r00+rot.e.r03)*rot.e.r22;
  7256.  
  7257.     if (setup.stadium<90)
  7258.         {
  7259.         if (vs3>=0)
  7260.             addobjnc(&stad3),numpols+=1000;
  7261.         if (vs4<0)
  7262.             addobjnc(&stad1),numpols+=1000;
  7263.         if (vs1>=0)
  7264.             addobjnc(&stad2),numpols+=1000;
  7265.         if (vs2<0)
  7266.             addobjnc(&stad4),numpols+=1000;
  7267.         }
  7268.     else
  7269.         {
  7270.         if (vs1>=0)
  7271.             addobjnc(&stad2);
  7272.         if (vs2<0)
  7273.             addobjnc(&stad4);
  7274.         if (vs3>=0)
  7275.             addobjnc(&stad3);
  7276.         if (vs4<0)
  7277.             addobjnc(&stad1);
  7278.         }
  7279.  
  7280.     if (scrmode3DB<0)
  7281.         dispolsn();
  7282.     else
  7283.         dispolst3DB();
  7284.  
  7285.  
  7286. //// PITCH MARKINGS
  7287.  
  7288.     objdepd(&l1,l1_d);
  7289.     addobjfc(&l1);
  7290.     objdepd(&l2,l2_d);
  7291.     addobjfc(&l2);
  7292.     objdepd(&l3,l3_d);
  7293.     addobjfc(&l3);
  7294.     objdepd(&l4,l4_d);
  7295.     addobjfc(&l4);
  7296.     objdepd(&l5,l5_d);
  7297.     addobjfc(&l5);
  7298.     objdepd(&l6,l6_d);
  7299.     addobjfc(&l6);
  7300.  
  7301.     if (setup.detail.lines)
  7302.         {
  7303.         objdepd(&circle,circle_d);
  7304.         addobjfc(&circle);
  7305.         objdepd(&semi1,s_circle_d1);
  7306.         addobjfc(&semi1);
  7307.         objdepd(&semi2,s_circle_d2);
  7308.         addobjfc(&semi2);
  7309.         }
  7310.     addobjfc(&spot1);
  7311.     addobjfc(&spot2);
  7312.     addobjfc(&spot3);
  7313.  
  7314.  
  7315. //// SHADOWS/HIGHLIGHTS
  7316.  
  7317.     // Player shadows
  7318.     plyrpt=(plyrdat *)plyrtb;
  7319.     for (i=0;i<NPLAYERS;i++)
  7320.         {
  7321.         if (plyrpt->type&&!plyrpt->htype&&setup.detail.players)
  7322.             {
  7323.             plhilight[0][0].x=plyrpt->x;
  7324.             plhilight[0][0].z=-plyrpt->z;
  7325.             addobjfc(&plhilight[0][0]);
  7326.             }
  7327.         plyrpt++;
  7328.         }
  7329.  
  7330.     // Ball shadow
  7331.     if (!balld) 
  7332.         {
  7333.         ballshad.x=plyrpt->x;
  7334.         ballshad.z=-plyrpt->z;
  7335.         }
  7336.     else
  7337.         {
  7338.         ballshad.x=mcap_ballx;
  7339.         ballshad.z=mcap_bally;
  7340.         }
  7341.     addobjfc(&ballshad);
  7342.         
  7343.  
  7344.     // Draw lines & shadows in order given (no sort).
  7345.     if (scrmode3DB<0)
  7346.         dispolsnx();
  7347.     else
  7348.         dispols3DB();
  7349.  
  7350.  
  7351.     // Player hilights 
  7352.     hcoo+=log_factor;
  7353.     while (hcoo>=4) hcoo-=4;
  7354.     plyrpt=(plyrdat *)plyrtb;
  7355.     for (i=0;i<NPLAYERS;i++)
  7356.         {
  7357.         if (plyrpt->type&&plyrpt->htype)
  7358.             {
  7359.             if ((plyrpt->htype!=4 && plyrpt->htype!=6) || hcoo>=2)
  7360.                 {
  7361.                 plhilight[plyrpt->htype][plyrpt->hcol].x=plyrpt->x;
  7362.                 plhilight[plyrpt->htype][plyrpt->hcol].z=-plyrpt->z;
  7363.                 if (plyrpt->htype==3 || plyrpt->htype==4)
  7364.                     {
  7365.                     plhilight[plyrpt->htype][plyrpt->hcol].crot=plyrpt->crot;
  7366.                       plhilight[plyrpt->htype][plyrpt->hcol].srot=-plyrpt->srot;
  7367.                       addobjyc(&plhilight[plyrpt->htype][plyrpt->hcol]);
  7368.                     }
  7369.                 else
  7370.                       addobjfc(&plhilight[plyrpt->htype][plyrpt->hcol]);
  7371.                 }
  7372.             }
  7373.         plyrpt++;
  7374.         }
  7375.  
  7376. objs *objtemp=curobj;
  7377.  
  7378.  
  7379. //// PLAYERS
  7380.  
  7381. coo++;
  7382.  
  7383.     balld=0;
  7384.     thisobj=player;
  7385.     plyrpt=plyrtb;
  7386.     plyrpto=plyrtwtb;
  7387.     for (i=0;i<NPLAYERS;i++)
  7388.         {
  7389.  
  7390.         // Saying something
  7391.         if (plyrpt->sprite>=0)
  7392.             {
  7393. //            *(xyz_ptr+(int)*xyz_ptr*3+1)=plyrpt->x;
  7394. //            *(xyz_ptr+(int)*xyz_ptr*3+2)=plyrpt->y+30;
  7395. //            *(xyz_ptr+(int)*xyz_ptr*3+3)=-plyrpt->z;
  7396. //            *(ref_ptr+(int)*xyz_ptr)=plyrpt->sprite;
  7397. //            (*xyz_ptr)++;
  7398.             }
  7399.  
  7400.         // Is he on?
  7401.         if (plyrpt->type)
  7402.             {
  7403.  
  7404.             // Set object data
  7405.             thisobj->x=plyrpt->x;            
  7406.             thisobj->y=plyrpt->y;
  7407.             thisobj->z=-plyrpt->z;
  7408.              thisobj->crot=-plyrpt->crot;
  7409.             thisobj->srot=plyrpt->srot;
  7410.  
  7411.             // Tweening
  7412.             an=plyrpt->anim;
  7413.             ano=plyrpto->anim;
  7414.             if (xf=(an&1 && an>=MC_BFOOTBL && an<=MC_TROTF))
  7415.                 mc1=&mcaps[an-1];
  7416.             else
  7417.                 mc1=&mcaps[an];
  7418.             if (an!=ano||plyrpto->tween>=0)
  7419.                 {
  7420.                 xfo=(ano&1 && ano>=MC_BFOOTBL && ano<=MC_TROTF);
  7421.                 if (plyrpto->tween<0)
  7422.                     {
  7423.                     plyrpto->tween=0;
  7424.                     plyrpto->tstep=plyrpt->fstep*2*log_factor;
  7425.                     plyrpto->animto=an;
  7426.                     }
  7427.                 else if (plyrpto->animto!=an)
  7428.                     {
  7429.                     tw=(plyrpto->twnfrm=plyrpto->twnpts2)+1;
  7430.                     tw1=plyrpto->twnpts1+1;
  7431.                     for (j=PLYRPTS*3;j;j--)
  7432.                         *(tw++)=*(tw1++);
  7433.                     plyrpto->tween=0;
  7434.                     plyrpto->tstep=plyrpt->fstep*2*log_factor;
  7435.                     plyrpto->anim=ano=plyrpto->animto;
  7436.                     plyrpto->animto=an;
  7437.                     xfo=(ano&1 && ano>=MC_BFOOTBL && ano<=MC_TROTF);
  7438.                     }
  7439.                 plyrpto->tween+=plyrpto->tstep;
  7440.                 if (plyrpto->tween>=1)
  7441.                     {
  7442.                     plyrpto->tween=-1;
  7443.                     thisobj->points=player_p[mc1->cappts+(short)(plyrpt->frame*mc1->capfrms)];
  7444.                     plyrpto->twnfrm=thisobj->points;
  7445.                     plyrpto->anim=plyrpto->animto;
  7446.                     }
  7447.                 else
  7448.                     {
  7449.                     tw1=player_p[mc1->cappts+(short)(plyrpt->frame*mc1->capfrms)]+1;
  7450.                     tw2=plyrpto->twnfrm+1;
  7451.                     tw=(thisobj->points=plyrpto->twnpts1)+1;
  7452.                     if ((xf&&!xfo)||(!xf&&xfo))
  7453.                         {
  7454.                         pt1=plyrpto->tween;
  7455.                         pt2=1-pt1;
  7456.                         tw[0*3]  =tw1[0*3]  *pt1+tw2[0*3]  *pt2;
  7457.                         tw[0*3+1]=tw1[0*3+1]*pt1+tw2[0*3+1]*pt2;
  7458.                         tw[0*3+2]=tw1[0*3+2]*pt1-tw2[0*3+2]*pt2;
  7459.                         tw[1*3]  =tw1[1*3]  *pt1+tw2[1*3]  *pt2;
  7460.                         tw[1*3+1]=tw1[1*3+1]*pt1+tw2[1*3+1]*pt2;
  7461.                         tw[1*3+2]=tw1[1*3+2]*pt1-tw2[1*3+2]*pt2;
  7462.                         tw[2*3]  =tw1[2*3]  *pt1+tw2[2*3]  *pt2;
  7463.                         tw[2*3+1]=tw1[2*3+1]*pt1+tw2[2*3+1]*pt2;
  7464.                         tw[2*3+2]=tw1[2*3+2]*pt1-tw2[2*3+2]*pt2;
  7465.                         tw[3*3]  =tw1[3*3]  *pt1+tw2[3*3]  *pt2;
  7466.                         tw[3*3+1]=tw1[3*3+1]*pt1+tw2[3*3+1]*pt2;
  7467.                         tw[3*3+2]=tw1[3*3+2]*pt1-tw2[3*3+2]*pt2;
  7468.                         tw[4*3]  =tw1[4*3]  *pt1+tw2[4*3]  *pt2;
  7469.                         tw[4*3+1]=tw1[4*3+1]*pt1+tw2[4*3+1]*pt2;
  7470.                         tw[4*3+2]=tw1[4*3+2]*pt1-tw2[4*3+2]*pt2;
  7471.                         tw[5*3]  =tw1[5*3]  *pt1+tw2[8*3]  *pt2;
  7472.                         tw[5*3+1]=tw1[5*3+1]*pt1+tw2[8*3+1]*pt2;
  7473.                         tw[5*3+2]=tw1[5*3+2]*pt1-tw2[8*3+2]*pt2;
  7474.                         tw[6*3]  =tw1[6*3]  *pt1+tw2[9*3]  *pt2;
  7475.                         tw[6*3+1]=tw1[6*3+1]*pt1+tw2[9*3+1]*pt2;
  7476.                         tw[6*3+2]=tw1[6*3+2]*pt1-tw2[9*3+2]*pt2;
  7477.                         tw[7*3]  =tw1[7*3]  *pt1+tw2[10*3]  *pt2;
  7478.                         tw[7*3+1]=tw1[7*3+1]*pt1+tw2[10*3+1]*pt2;
  7479.                         tw[7*3+2]=tw1[7*3+2]*pt1-tw2[10*3+2]*pt2;
  7480.                         tw[8*3]  =tw1[8*3]  *pt1+tw2[5*3]  *pt2;
  7481.                         tw[8*3+1]=tw1[8*3+1]*pt1+tw2[5*3+1]*pt2;
  7482.                         tw[8*3+2]=tw1[8*3+2]*pt1-tw2[5*3+2]*pt2;
  7483.                         tw[9*3]  =tw1[9*3]  *pt1+tw2[6*3]  *pt2;
  7484.                         tw[9*3+1]=tw1[9*3+1]*pt1+tw2[6*3+1]*pt2;
  7485.                         tw[9*3+2]=tw1[9*3+2]*pt1-tw2[6*3+2]*pt2;
  7486.                         tw[10*3]  =tw1[10*3]  *pt1+tw2[7*3]  *pt2;
  7487.                         tw[10*3+1]=tw1[10*3+1]*pt1+tw2[7*3+1]*pt2;
  7488.                         tw[10*3+2]=tw1[10*3+2]*pt1-tw2[7*3+2]*pt2;
  7489.                         tw[11*3]  =tw1[11*3]  *pt1+tw2[12*3]  *pt2;
  7490.                         tw[11*3+1]=tw1[11*3+1]*pt1+tw2[12*3+1]*pt2;
  7491.                         tw[11*3+2]=tw1[11*3+2]*pt1-tw2[12*3+2]*pt2;
  7492.                         tw[12*3]  =tw1[12*3]  *pt1+tw2[11*3]  *pt2;
  7493.                         tw[12*3+1]=tw1[12*3+1]*pt1+tw2[11*3+1]*pt2;
  7494.                         tw[12*3+2]=tw1[12*3+2]*pt1-tw2[11*3+2]*pt2;
  7495.                         tw[13*3]  =tw1[13*3]  *pt1+tw2[17*3]  *pt2;
  7496.                         tw[13*3+1]=tw1[13*3+1]*pt1+tw2[17*3+1]*pt2;
  7497.                         tw[13*3+2]=tw1[13*3+2]*pt1-tw2[17*3+2]*pt2;
  7498.                         tw[14*3]  =tw1[14*3]  *pt1+tw2[18*3]  *pt2;
  7499.                         tw[14*3+1]=tw1[14*3+1]*pt1+tw2[18*3+1]*pt2;
  7500.                         tw[14*3+2]=tw1[14*3+2]*pt1-tw2[18*3+2]*pt2;
  7501.                         tw[15*3]  =tw1[15*3]  *pt1+tw2[19*3]  *pt2;
  7502.                         tw[15*3+1]=tw1[15*3+1]*pt1+tw2[19*3+1]*pt2;
  7503.                         tw[15*3+2]=tw1[15*3+2]*pt1-tw2[19*3+2]*pt2;
  7504.                         tw[17*3]  =tw1[17*3]  *pt1+tw2[13*3]  *pt2;
  7505.                         tw[17*3+1]=tw1[17*3+1]*pt1+tw2[13*3+1]*pt2;
  7506.                         tw[17*3+2]=tw1[17*3+2]*pt1-tw2[13*3+2]*pt2;
  7507.                         tw[18*3]  =tw1[18*3]  *pt1+tw2[14*3]  *pt2;
  7508.                         tw[18*3+1]=tw1[18*3+1]*pt1+tw2[14*3+1]*pt2;
  7509.                         tw[18*3+2]=tw1[18*3+2]*pt1-tw2[14*3+2]*pt2;
  7510.                         tw[19*3]  =tw1[19*3]  *pt1+tw2[15*3]  *pt2;
  7511.                         tw[19*3+1]=tw1[19*3+1]*pt1+tw2[15*3+1]*pt2;
  7512.                         tw[19*3+2]=tw1[19*3+2]*pt1-tw2[15*3+2]*pt2;
  7513.                         tw[16*3]  =tw1[16*3]  *pt1+tw2[20*3]  *pt2;
  7514.                         tw[16*3+1]=tw1[16*3+1]*pt1+tw2[20*3+1]*pt2;
  7515.                         tw[16*3+2]=tw1[16*3+2]*pt1-tw2[20*3+2]*pt2;
  7516.                         tw[20*3]  =tw1[20*3]  *pt1+tw2[16*3]  *pt2;
  7517.                         tw[20*3+1]=tw1[20*3+1]*pt1+tw2[16*3+1]*pt2;
  7518.                         tw[20*3+2]=tw1[20*3+2]*pt1-tw2[16*3+2]*pt2;
  7519.                         tw[21*3]  =tw1[21*3]  *pt1+tw2[22*3]  *pt2;
  7520.                         tw[21*3+1]=tw1[21*3+1]*pt1+tw2[22*3+1]*pt2;
  7521.                         tw[21*3+2]=tw1[21*3+2]*pt1-tw2[22*3+2]*pt2;
  7522.                         tw[22*3]  =tw1[22*3]  *pt1+tw2[21*3]  *pt2;
  7523.                         tw[22*3+1]=tw1[22*3+1]*pt1+tw2[21*3+1]*pt2;
  7524.                         tw[22*3+2]=tw1[22*3+2]*pt1-tw2[21*3+2]*pt2;
  7525.                         if (tw2[23*3+1]<0)
  7526.                             {
  7527.                             tw[23*3]  =tw1[23*3];
  7528.                             tw[23*3+1]=tw1[23*3+1];
  7529.                             tw[23*3+2]=tw1[23*3+2];
  7530.                             }
  7531.                         else
  7532.                             {
  7533.                             tw[23*3]  =tw1[23*3]  *pt1+tw2[23*3]  *pt2;
  7534.                             tw[23*3+1]=tw1[23*3+1]*pt1+tw2[23*3+1]*pt2;
  7535.                             tw[23*3+2]=tw1[23*3+2]*pt1-tw2[23*3+2]*pt2;
  7536.                             }
  7537.                         tw[24*3]  =tw1[24*3]  *pt1+tw2[25*3]  *pt2;
  7538.                         tw[24*3+1]=tw1[24*3+1]*pt1+tw2[25*3+1]*pt2;
  7539.                         tw[24*3+2]=tw1[24*3+2]*pt1-tw2[25*3+2]*pt2;
  7540.                         tw[25*3]  =tw1[25*3]  *pt1+tw2[24*3]  *pt2;
  7541.                         tw[25*3+1]=tw1[25*3+1]*pt1+tw2[24*3+1]*pt2;
  7542.                         tw[25*3+2]=tw1[25*3+2]*pt1-tw2[24*3+2]*pt2;
  7543.                         tw[26*3]  =tw1[26*3]  *pt1+tw2[27*3]  *pt2;
  7544.                         tw[26*3+1]=tw1[26*3+1]*pt1+tw2[27*3+1]*pt2;
  7545.                         tw[26*3+2]=tw1[26*3+2]*pt1-tw2[27*3+2]*pt2;
  7546.                         tw[27*3]  =tw1[27*3]  *pt1+tw2[26*3]  *pt2;
  7547.                         tw[27*3+1]=tw1[27*3+1]*pt1+tw2[26*3+1]*pt2;
  7548.                         tw[27*3+2]=tw1[27*3+2]*pt1-tw2[26*3+2]*pt2;
  7549.                         }
  7550.                     else
  7551.                         {
  7552.                         pt1=plyrpto->tween;
  7553.                         pt2=1-pt1;
  7554.                         for (j=PLYRPTS*3;j;j--)
  7555.                             *(tw++)=*(tw1++)*pt1+*(tw2++)*pt2;
  7556.                         }
  7557.                     }
  7558.                 }
  7559.             else
  7560.                 // No tween
  7561.                 {
  7562.                 thisobj->points=player_p[mc1->cappts+(short)(plyrpt->frame*mc1->capfrms)];
  7563.                 plyrpto->twnfrm=thisobj->points;
  7564.                 plyrpto->anim=an;
  7565.                 }
  7566.  
  7567.             // Motion captured ball
  7568.             if (thisobj->points[1+23*3+1]>=0)
  7569.                 {
  7570.                 ball.y=-thisobj->points[1+23*3];
  7571.                 if (xf)
  7572.                     ball.z=-thisobj->points[1+23*3+2];
  7573.                 else
  7574.                     ball.z=thisobj->points[1+23*3+2];
  7575.                 ball.x=-ball.y*thisobj->crot+ball.z*thisobj->srot+thisobj->x;
  7576.                 ball.z=ball.y*thisobj->srot+ball.z*thisobj->crot+thisobj->z;
  7577.                 ball.y=thisobj->points[1+23*3+1]+thisobj->y;
  7578.                 balld=1;
  7579.  
  7580. // (ANDYF) Grab motion capture coordinates of ball...
  7581.                 mcap_ballx=0;//ball.x;
  7582.                 mcap_bally=0;//ball.z;
  7583.                 mcap_ballz=0;//ball.y;
  7584.  
  7585.                 }
  7586.  
  7587.             // Wire frame mode
  7588.             if (wire)
  7589.                 thisobj->faces=playertypes[11];
  7590.             else
  7591.                 {
  7592.  
  7593.                 // Is he a goalie
  7594.                 if (xf)
  7595.                     if (i==0||i==11)
  7596.                         { thisobj->faces=playertypes[(plyrpt->type==1||!setup.M8)?10:20]; }
  7597.                     else
  7598.                         if (game_data[plyrpt->type==1?TEMPa:TEMPb].players[i%11].skin_tone&&setup.M8)
  7599.                             thisobj->faces=playertypes[(short)plyrpt->type+15];
  7600.                         else
  7601.                             thisobj->faces=playertypes[(short)plyrpt->type+5];
  7602.                 else
  7603.                     if (i==0||i==11)
  7604.                         { thisobj->faces=playertypes[(plyrpt->type==1||!setup.M8)?5:15]; }
  7605.                     else
  7606.                         if (game_data[plyrpt->type==1?TEMPa:TEMPb].players[i%11].skin_tone&&setup.M8)
  7607.                             thisobj->faces=playertypes[(short)plyrpt->type+10];
  7608.                         else
  7609.                             thisobj->faces=playertypes[(short)plyrpt->type];
  7610.                 if (thisobj->faces==player_fl&&!setup.M8) 
  7611.                     thisobj->faces=player_fr;
  7612.  
  7613.                 // Player number
  7614.                  if (i<22)
  7615.                     if (setup.detail.players)
  7616.                         {
  7617.                         thisobj->faces[0]=13;
  7618.                         if (plyrpt->type==1)
  7619.                             thisobj->faces[82]=-X_TM-2016-(plyrpt->number-1);
  7620.                         else
  7621.                             thisobj->faces[82]=-X_TM-2016-15-(plyrpt->number-1);
  7622.                         }
  7623.                     else
  7624.                         thisobj->faces[0]=12;
  7625.                 }
  7626.  
  7627. //plyrpt->frame=modf(plyrpt->frame+(float)1/mc1->capfrms,&null);
  7628.   
  7629.             // Draw object
  7630.             if (objdep(*thisobj)>15)
  7631.                 {
  7632.                 oldobj=curobj;
  7633.                 if (xf)
  7634.                     addobjyf(thisobj);
  7635.                 else
  7636.                     addobjy(thisobj);
  7637.                 if (oldobj!=curobj) sortobj(oldobj);
  7638.                 }
  7639.             thisobj++;
  7640.             }
  7641.         plyrpt++;
  7642.         plyrpto++;
  7643.         }                        
  7644.  
  7645.  
  7646. //// BALL
  7647.  
  7648.     if (!balld)
  7649.         {
  7650.         ball.x=plyrpt->x;
  7651.         ball.y=plyrpt->y;
  7652.         ball.z=-plyrpt->z;
  7653.         }
  7654.     ball.crot=plyrpt->crot;
  7655.     ball.srot=plyrpt->srot;
  7656.     objdepd(&ball,ball_d);
  7657.     addobjxy(&ball,plyrpt->frame,plyrpt->fstep);
  7658.     plyrpt++;
  7659.  
  7660.  
  7661.  
  7662. //// GOALS
  7663.  
  7664.     oldobj=curobj;
  7665.     objdepd(&goal1_1,goal1_a);
  7666.     addobjnc(&goal1_1);
  7667.     if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7668.     objdepd(&goal2_1,goal2_a);
  7669.     addobjnc(&goal2_1);
  7670.     if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7671.     objdepd(&goal3_1,goal3_a);
  7672.     addobjnc(&goal3_1);
  7673.     if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7674.     objdepd(&goal4_1,goal4_a);
  7675.     addobjnc(&goal4_1);
  7676.  
  7677.     oldobj=curobj;
  7678.     objdepd(&goal1_2,goal1_b);
  7679.     addobjnc(&goal1_2);
  7680.     if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7681.     objdepd(&goal2_2,goal2_b);
  7682.     addobjnc(&goal2_2);
  7683.     if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7684.     objdepd(&goal3_2,goal3_b);
  7685.     addobjnc(&goal3_2);
  7686.     if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7687.     objdepd(&goal4_2,goal4_b);
  7688.     addobjnc(&goal4_2);
  7689.  
  7690.  
  7691. //// FLAGS
  7692.  
  7693.     if (setup.detail.lines)
  7694.         {
  7695.         oldobj=curobj;
  7696.         addobjnc(&flag_1);
  7697.         if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7698.         addobjnc(&flag_2);
  7699.         if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7700.         addobjnc(&flag_3);
  7701.         if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7702.         addobjnc(&flag_4);
  7703.         if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7704.     }
  7705.  
  7706.  
  7707. //// SPRITES
  7708.  
  7709.     if (buffer==&main_buff)
  7710.         addobjsp(xyz_ptr,ref_ptr);        
  7711.     
  7712.  
  7713.     // Sort objects from z value
  7714.     qsort(objtemp,curobj-objtemp,sizeof(objs),objcmp);
  7715.  
  7716. // Sort and render players, ball, goals and sprites.
  7717.     if (scrmode3DB<0)
  7718.         dispolsn();
  7719.     else
  7720.         dispolst3DB();
  7721.  
  7722.  
  7723. // Set up pt lists for 3D Blaster
  7724.     curpts3DB=&Vertex[0];
  7725.     curtex3DB=&Texture[0];
  7726.  
  7727. //// SCANNER
  7728.  
  7729.     if (key_togs[0xf]&&buffer!=&vidi_buff)
  7730.         if (scrmode==0x13)
  7731.             {
  7732.             scrpt scanner_l[]={8,56, 44,56, 44,8, 8,8};
  7733.             if (scrmode3DB<0)
  7734.                 polyf((pnt *)scanner_l,4,filters[0]);
  7735.             else
  7736.                 rectshadow3DB(buffer,8,render_buff.clip_hgt-56,36,48);
  7737.             draw_sprite(buffer,88,9,buffer->clip_hgt-55,0);
  7738.             plyrpt=(plyrdat *)plyrtb;
  7739.             for (i=0;i<22;i++)
  7740.                 {
  7741.                 if (plyrpt->type)
  7742.                     draw_sprite(buffer,89+(((i<11&&(!(match_half&1)))||(i>=11&&(match_half&1)))?0:2),8+(plyrpt->z*34)/800,buffer->clip_hgt-10-(plyrpt->x*46)/1280,0);
  7743.                 plyrpt++;                      
  7744.                 }
  7745.             plyrpt+=3;
  7746.               draw_sprite(buffer,89,8+(plyrpt->z*34)/800,buffer->clip_hgt-10-(ball.x*46)/1280,31);
  7747.             }
  7748.         else
  7749.             {
  7750.             scrpt scanner_h[]={16,112, 88,112, 88,16, 16,16};
  7751.             if (scrmode3DB<0)
  7752.                 polyf((pnt *)scanner_h,4,filters[0]);
  7753.             else
  7754.                 rectshadow3DB(buffer,16,render_buff.clip_hgt-112,72,96);
  7755.             draw_sprite_d(buffer,88,18,buffer->clip_hgt-110,0);
  7756.             plyrpt=(plyrdat *)plyrtb;
  7757.             for (i=0;i<22;i++)
  7758.                 {
  7759.                 if (plyrpt->type)
  7760.                     draw_sprite(buffer,90+(((i<11&&(!(match_half&1)))||(i>=11&&(match_half&1)))?0:2),15+2*(plyrpt->z*34)/800,buffer->clip_hgt-21-2*(plyrpt->x*46)/1280,0);
  7761.                 plyrpt++;
  7762.                 }
  7763.             plyrpt+=3;
  7764.             draw_sprite(buffer,89,16+2*(plyrpt->z*34)/800,buffer->clip_hgt-20-2*(ball.x*46)/1280,31);
  7765.             }
  7766.  
  7767.  
  7768. //// ANIMATE TEXTURES
  7769.  
  7770.     if (0)//setup.M8&&vidi_anim) 
  7771. //    if (setup.M8&&vidi_anim) 
  7772.         if (spool)
  7773.             switch(vidi_anim)
  7774.                 {
  7775.                 case 1: do_extra_time_anim(spool); break;
  7776.                 case 2: do_foul_anim(spool); break;
  7777.                 case 3: do_full_time_anim(spool); break;
  7778.                 case 4: do_half_time_anim(spool); break;
  7779.                 case 5: do_penalty_anim(spool); break;
  7780.                 case 6: do_goal_anim(spool); break;
  7781.                 case 7: do_win_f_anim(spool); break;
  7782.                 case 9: do_win_g_anim(spool); break;
  7783.                 case 11: do_win_s_anim(spool); break;
  7784.                 }
  7785.         else
  7786.             do_anim(vidi);
  7787.  
  7788.     if (wind_on)
  7789.         {
  7790.         fcoo+=log_factor;
  7791.         if (fcoo>=(128-wind_speed)/10)
  7792.             {
  7793.             if (flag_f[1+5*6+1]==-X_TM-2048)
  7794.                 flag_f[1+5*6+1]=flag_f[1+5*6+6]=-X_TM-2046;
  7795.             else
  7796.                 flag_f[1+5*6+1]=--flag_f[1+5*6+6];
  7797.             fcoo=0;
  7798.             }
  7799.         fs=(PI/2)*(wind_speed+16)/144;
  7800.         fx=8.5*sin(fs)+1;
  7801.         fy=8.5*cos(fs);
  7802.         flag_p[1+8*3]=fx*wind_x;
  7803.         flag_p[1+8*3+1]=15-fy;
  7804.         flag_p[1+8*3+2]=fx*wind_y;
  7805.         }
  7806.     else
  7807.         {
  7808.         flag_p[1+8*3]=1.751;
  7809.         flag_p[1+8*3+1]=6.629;
  7810.         flag_p[1+8*3+2]=1.751;
  7811.         }
  7812.  
  7813.  
  7814.     if (menu&&buffer!=&vidi_buff)
  7815.         {
  7816.         slco+=log_factor*5;
  7817.         if (mcount>0) 
  7818.             if (slide>0) while (slco>=1&&slide>0) slco--,slide--;
  7819.             else while (slco>=1) slco--,mcount--;
  7820.         else
  7821.             {
  7822.             while (slco>=1&&slide<oslide) slco--,slide++;
  7823.             if (slide>=oslide) menu=0,rdmenu=1;
  7824.             }
  7825.         if (scrmode==0x13)
  7826.             {
  7827.             menx3DB=menu_buff_l[menu-1].scale_x;
  7828.             meny3DB=menu_buff_l[menu-1].scale_y+(slide+12+(menu==22?10:0));
  7829. #ifdef BLASTDEMO
  7830.             if (scrmode3DB==1) meny3DB+=40;
  7831. #endif
  7832.             menu_buff.buff_start=menu_buff_l[menu-1].buff_start+MCGA_buff[0].buff_wid*(slide+12+(menu==22?10:0));
  7833.             menu_buff.buff_wid=menu_buff_l[menu-1].buff_wid;
  7834.             menu_buff.buff_hgt=menu_buff_l[menu-1].buff_hgt;
  7835.             menu_buff.clip_wid=menu_buff_l[menu-1].clip_wid;
  7836.             menu_buff.clip_hgt=menu_buff_l[menu-1].clip_hgt-(slide+12);
  7837.             }
  7838.         else
  7839.             {
  7840.             menx3DB=menu_buff_h[menu-1].scale_x+(scrmode3DB==5?80:0);
  7841.             meny3DB=menu_buff_h[menu-1].scale_y+((slide+12+(menu==22?10:0))<<1);
  7842.             if (scrmode3DB>=0)
  7843.                 {
  7844.                 switch (scrmode3DB)
  7845.                     {
  7846.                     case 2:meny3DB-=50;break;
  7847.                     case 4:meny3DB+=80;break;
  7848.                     case 5:meny3DB+=200;break;
  7849.                     }
  7850.                 menu_buff.buff_start=menu_buff_h[menu-1].buff_start+VESA_buff[scrmode==0x100?0:1][0].buff_wid*((slide+12+(menu==22?10:0))<<1);
  7851.                 }
  7852.             else
  7853.                 if (scrmode!=0x101)
  7854.                     menu_buff.buff_start=menu_buff_h[menu-1].buff_start+VESA_buff[scrmode==0x100?0:1][0].buff_wid*((slide+12+(menu==22?10:0))<<1);
  7855.                 else
  7856.                     menu_buff.buff_start=menu_buff_h[menu-1].buff_start+VESA_buff[scrmode==0x100?0:1][0].buff_wid*((slide+12+(menu==22?10:0))<<1);
  7857.             menu_buff.buff_wid=menu_buff_h[menu-1].buff_wid;
  7858.             menu_buff.buff_hgt=menu_buff_h[menu-1].buff_hgt;
  7859.             menu_buff.clip_wid=menu_buff_h[menu-1].clip_wid;
  7860.             menu_buff.clip_hgt=menu_buff_h[menu-1].clip_hgt-((slide+12)<<1);
  7861.             }
  7862.         switch (menu)
  7863.             {
  7864.             case 1:    
  7865.                 goal_menu(&menu_buff, mdata1, mdata2, mdata3);
  7866.                 break;
  7867.             case 2:    
  7868.                 booked_menu(&menu_buff, mdata1, mdata2);
  7869.                 break;
  7870.             case 3:    
  7871.                 off_menu(&menu_buff, mdata1, mdata2);
  7872.                 break;
  7873.             case 4:    
  7874.                 direct_menu(&menu_buff, mdata1);
  7875.                 break;
  7876.             case 5:    
  7877.                 indirect_menu(&menu_buff, mdata1);
  7878.                 break;
  7879.             case 6:    
  7880.                 penalty_menu(&menu_buff, mdata1);
  7881.                 break;
  7882.             case 7:    
  7883.                 corner_menu(&menu_buff, mdata1);
  7884.                 break;
  7885.             case 8:    
  7886.                 throw_menu(&menu_buff, mdata1);
  7887.                 break;
  7888.             case 9:    
  7889.                 goalkick_menu(&menu_buff, mdata1);
  7890.                 break;
  7891.             case 10:    
  7892.                 kickoff_menu(&menu_buff, mdata1);
  7893.                 break;
  7894.             case 11:    
  7895.                 offside_menu(&menu_buff, mdata1);
  7896.                 break;
  7897.             case 12:    
  7898.                 injured_menu(&menu_buff, mdata1, mdata2);
  7899.                 break;
  7900.             case 13:    
  7901.                 fulltime_menu(&menu_buff);
  7902.                 adjust_menu();
  7903.                 break;
  7904.             case 14:    
  7905.                 extratime_menu(&menu_buff);
  7906.                 adjust_menu();
  7907.                 break;
  7908.             case 15:
  7909.                 halftime_menu(&menu_buff);
  7910.                 adjust_menu();
  7911.                 break;
  7912.             case 16:    
  7913.                 penalty_shootout_menu(&menu_buff);
  7914.                 adjust_menu();
  7915.                 break;
  7916.             case 17:    
  7917.                 final_score_menu(&menu_buff);
  7918.                 adjust_menu();
  7919.                 break;
  7920.             case 18:    
  7921.                 owngoal_menu(&menu_buff, mdata1, mdata2, mdata3);
  7922.                 break;
  7923.             case 19:    
  7924.                 options_menu(&menu_buff, mdata1, mdata2);
  7925.                 break;
  7926.             case 20:    
  7927.                 formation_menu(&menu_buff, mdata1, mdata2);
  7928.                 break;
  7929.             case 21:    
  7930.                 substitution_menu(&menu_buff, mdata1, mdata2);
  7931.                 break;
  7932.             case 22:    
  7933.                 replay_menu(&menu_buff, mdata1);
  7934.                 break;
  7935.             case 23:    
  7936.                 ref_menu(&menu_buff);
  7937.                 break;
  7938.             case 24:    
  7939.                 stats_menu(&menu_buff);
  7940.                 break;
  7941.             }
  7942.         }
  7943.  
  7944.     if (key_togs[0x0a])
  7945.         vidi_l=1;
  7946.     else
  7947.         {
  7948.         if (vidi_l)
  7949.             stop_anim(vidi);
  7950.         vidi_l=0;
  7951.         }
  7952.  
  7953.     if (buffer!=&vidi_buff)
  7954.         {
  7955.         char tstr[50];
  7956.         int mid=buffer->clip_wid>>1;
  7957.         int end=buffer->clip_hgt;
  7958.         menx3DB=meny3DB=0;
  7959.         if (menu<19||menu>22)
  7960.             if (match_time.secs<10)
  7961.                 sprintf(tstr,"%d:0%d",match_time.min,(int)match_time.secs);
  7962.             else
  7963.                 sprintf(tstr,"%d:%2d",match_time.min,(int)match_time.secs);
  7964.         else
  7965.             switch(menu)
  7966.                 {
  7967.                 case 19:    sprintf(tstr,GetTEXT( OPTN_TEXT )); break;
  7968.                 case 20:    sprintf(tstr,GetTEXT( FRMN_TEXT )); break;
  7969.                 case 21:    sprintf(tstr,GetTEXT( SBTN_TEXT )); break;
  7970.                 case 22:    sprintf(tstr,GetTEXT( RPLY_TEXT )); break;
  7971.                 }
  7972.         if (scrmode==0x13)
  7973.             {
  7974.             draw_string(buffer,1,mid,1,tstr,31,2);
  7975.             if (!menu)
  7976.                 {
  7977. //                draw_string(&MCGA_buff[0],end-8,140,0,EUROmatch_info.TeamAname,31,1);
  7978.                 i=draw_string(buffer,1,mid-20,end-8,EUROmatch_info.TeamAname,32,1);
  7979.                 if (sub_pending&1) draw_sprite(buffer,84,mid-20-i-16,end-16,0);
  7980.                 sprintf(tstr,"%d=%d",team_a_goals,team_b_goals);
  7981.                 draw_string(buffer,1,mid,end-8,tstr,31,2);
  7982.                 i=draw_string(buffer,1,mid+20,end-8,EUROmatch_info.TeamBname,56,0);
  7983.                 if (sub_pending&2) draw_sprite(buffer,85,mid+20+i+2,end-16,0);
  7984.                 }
  7985.             }
  7986.         else
  7987.             {                              
  7988.             draw_string(buffer,2,mid,1,tstr,31,2);
  7989.             if (!menu)
  7990.                 {
  7991. //                draw_string(&VESA_buff[0][0],end-14,mid-40,0,EUROmatch_info.TeamAname,31,1);
  7992.                 i=draw_string(buffer,2,mid-40,end-14,EUROmatch_info.TeamAname,32,1);
  7993.                 if (sub_pending&1) draw_sprite(buffer,86,mid-40-i-20,end-20,0);
  7994.                 sprintf(tstr,"%d=%d",team_a_goals,team_b_goals);
  7995.                 draw_string(buffer,2,mid,end-14,tstr,31,2);
  7996.                 i=draw_string(buffer,2,mid+40,end-14,EUROmatch_info.TeamBname,56,0);
  7997.                 if (sub_pending&2) draw_sprite(buffer,87,mid+40+i+4,end-20,0);
  7998.                 }
  7999.             }
  8000. #ifdef BLASTDEMO
  8001.         char prbuf[20];
  8002.         static float cl=0;
  8003.         static int cnt,clk,oldclk;
  8004.         cnt++;
  8005.         if (20==cnt)
  8006.             {
  8007.             cnt=0;
  8008.             clk=clock();
  8009.             cl=(20.*CLOCKS_PER_SEC)/(clk-oldclk);
  8010.             oldclk=clock();
  8011.             }
  8012.         draw_string(&main_buff,2,0,0,gcvt(cl,3,prbuf),31,0);
  8013. #endif
  8014.         }
  8015.  
  8016.     if (scrmode3DB>=0&&curpts3DB!=Vertex)
  8017.         {
  8018.         SetRectangleOutput3DB(texaddr3DB[0]);
  8019.         Render3DB(curpts3DB-Vertex);
  8020.         }
  8021.     }
  8022.  
  8023.  
  8024.  
  8025. /************************/
  8026. /* BUFFER DUMP ROUTINES */
  8027.  
  8028.  
  8029. int spin=25;
  8030.  
  8031. void dumpMCGAs(scrpt dispx,scrpt dispy)
  8032. {
  8033. int x;
  8034. int y;
  8035.  
  8036. char* scr_=(char*) 0xa0000,*scr_end;
  8037. char* scr_buf=(char *)render_buff.buff_start;
  8038.  
  8039. float scr_off,scr_stp;
  8040.  
  8041. scr_stp=100*cos(spin*3.1416/50);
  8042. scr_+=32000-((int)scr_stp)*320;
  8043. if (!scr_stp) scr_stp=200;
  8044. else scr_stp=100/scr_stp;
  8045.  
  8046. if (scr_stp>=0)
  8047.     {
  8048.     scr_end=(char *)0xa0000;
  8049.     while (scr_end<scr_)
  8050.         {
  8051.         memset(scr_end,0,320);
  8052.         scr_end+=320;
  8053.         }
  8054.     while ((y=(int)scr_off)<200) 
  8055.         {
  8056.         for (x=0;x<320;x++)
  8057.             *(scr_++)=*(scr_buf+y*320+x);
  8058.         scr_off+=scr_stp;
  8059.         }
  8060.     while (scr_<(char *)0xafa00)
  8061.         {
  8062.         memset(scr_,0,320);
  8063.         scr_+=320;
  8064.         }
  8065.     }
  8066. else
  8067.     {
  8068.     scr_end=(char *)0xafa00;
  8069.     while (scr_end!=scr_)
  8070.         {
  8071.         scr_end-=320;
  8072.         memset(scr_end,0,320);
  8073.         }
  8074.     while ((y=(int)scr_off)>-200) 
  8075.         {
  8076.         for (x=0;x<320;x++)
  8077.             *(scr_++)=*(scr_buf-y*320+x);
  8078.         scr_-=640;
  8079.         scr_off+=scr_stp;
  8080.         }
  8081.     while (scr_>=(char *)0xa0000)
  8082.         {
  8083.         memset(scr_,0,320);
  8084.         scr_-=320;
  8085.         }
  8086.     }
  8087. spin++;
  8088. }
  8089.  
  8090.  
  8091. // Dump main buffer to MCGA 
  8092. void dumpMCGA(scrpt dispx,scrpt dispy)
  8093.     {
  8094.     int mx,my,mw,mh;
  8095.     BYTE *tptr;
  8096.     if (!rdmenu)
  8097.         {
  8098.         dispx=(320-render_buff.clip_wid)>>1;
  8099.         dispy=(200-render_buff.clip_hgt)>>1;
  8100.         mcgacpy(render_buff.buff_start,dispx,dispy,render_buff.clip_wid,render_buff.clip_hgt,render_buff.buff_wid);
  8101.         }
  8102.     else
  8103.         {
  8104.         mcgacpy(scrb+320,0,0,320,200,320);
  8105.         rdmenu=0;
  8106.         }
  8107.     if (menu && setup.screen_size)
  8108.         {
  8109.         mx=(320-menu_buff.clip_wid)>>1;
  8110.         my=((menu_buff.buff_start-mx)-MCGA_buff[0].buff_start)/320;
  8111.         if (menu_buff.clip_wid>render_buff.clip_wid)
  8112.             {
  8113.                 mw=(menu_buff.clip_wid-render_buff.clip_wid)>>1;
  8114.                 mh=menu_buff.clip_hgt;
  8115.                 mcgacpy(menu_buff.buff_start,mx,my,mw,mh,320);
  8116.                   vclear(menu_buff.buff_start,mw,mh,320,5);
  8117.                 mcgacpy(menu_buff.buff_start+menu_buff.clip_wid-mw,mx+menu_buff.clip_wid-mw,my,mw,mh,320);
  8118.                 vclear(menu_buff.buff_start+menu_buff.clip_wid-mw,mw,mh,320,5);
  8119.             }
  8120.         mw=render_buff.clip_wid;
  8121.         mh=(200-render_buff.clip_hgt)>>1;
  8122.         mx=(320-render_buff.clip_wid)>>1;
  8123.         my=200-mh;
  8124.         tptr=MCGA_buff[0].buff_start+my*320+mx;
  8125.         mcgacpy(tptr,mx,my,mw,mh,320);
  8126.         vclear(tptr,mw,mh,320,5);
  8127.         }
  8128.     }
  8129.  
  8130.  
  8131. // Dump general VESA 256-colour buffer to SVGA 
  8132. void dumpV256(scrpt dispx,scrpt dispy)
  8133.     {
  8134.     int mx,my,mw,mh;
  8135.     BYTE *tptr;
  8136.     if (!rdmenu)
  8137.         {
  8138.         dispx=(render_buff.buff_wid-render_buff.clip_wid)>>1;
  8139.         dispy=(render_buff.buff_hgt-render_buff.clip_hgt)>>1;
  8140.         svgacpy(render_buff.buff_start,dispx,dispy,render_buff.clip_wid,render_buff.clip_hgt,render_buff.buff_wid);
  8141.         }
  8142.     else
  8143.         {
  8144.         if (scrmode==0x100)
  8145.             svgacpy(scrb+640,0,0,640,400,640);
  8146.         else
  8147.             svgacpy(scrb+640,0,0,640,480,640);
  8148.         rdmenu=0;
  8149.         }
  8150.     if (menu && setup.screen_size)
  8151.         {
  8152.         mx=(640-menu_buff.clip_wid)>>1;
  8153.         my=((menu_buff.buff_start-mx)-VESA_buff[scrmode==0x100?0:1][0].buff_start)/640;
  8154.         if (menu_buff.clip_wid>render_buff.clip_wid)
  8155.             {
  8156.                 mw=(menu_buff.clip_wid-render_buff.clip_wid)>>1;
  8157.                 mh=menu_buff.clip_hgt;
  8158.                 svgacpy(menu_buff.buff_start,mx,my,mw,mh,640);
  8159.                 vclear(menu_buff.buff_start,mw,mh,640,5);
  8160.                 svgacpy(menu_buff.buff_start+menu_buff.clip_wid-mw,mx+menu_buff.clip_wid-mw,my,mw,mh,640);
  8161.                 vclear(menu_buff.buff_start+menu_buff.clip_wid-mw,mw,mh,640,5);
  8162.             }
  8163.         mw=render_buff.clip_wid;
  8164.         mh=(VESA_buff[scrmode==0x100?0:1][0].clip_hgt-render_buff.clip_hgt)>>1;
  8165.         mx=(640-render_buff.clip_wid)>>1;
  8166.         my=VESA_buff[scrmode==0x100?0:1][0].clip_hgt-mh;
  8167.         tptr=VESA_buff[scrmode==0x100?0:1][0].buff_start+my*640+mx;
  8168.         svgacpy(tptr,mx,my,mw,mh,640);
  8169.         vclear(tptr,mw,mh,640,5);
  8170.         }
  8171.     }
  8172.  
  8173.  
  8174. // Null dump routine
  8175. void dumpnull(scrpt dispx,scrpt dispy) {}
  8176.  
  8177.  
  8178. // 3d Blaster dump routine
  8179. void dump3DB(scrpt dispx,scrpt dispy)
  8180.     {
  8181.     SwapBuffer3DB();    
  8182. //    ClearBuffer3DB();    
  8183.     }
  8184.  
  8185.  
  8186. // Dump vidi buffer to map page through filter (already there)
  8187. void dumpvidi1(scrpt dispx,scrpt dispy)
  8188.     {
  8189.     BYTE *scrpt;
  8190.     short i,j;
  8191.     if (vidi_anim) return;
  8192.     scrpt=render_buff.buff_start;
  8193.     for (i=0;i<render_buff.clip_hgt;i++)
  8194.         {
  8195.         for (j=0;j<render_buff.clip_wid;j++)
  8196.             {
  8197.             *scrpt=filters[1][*scrpt];
  8198.             scrpt++;
  8199.             }
  8200.         scrpt+=render_buff.buff_wid-render_buff.clip_wid;
  8201.         }
  8202.     }
  8203.  
  8204.  
  8205.  
  8206. /********************************/
  8207. /* INITIALISE DISPLAY & OBJECTS */
  8208.  
  8209. word getselectors(word noselectors)
  8210.     {
  8211.     union REGS regs;
  8212.     regs.w.cx=noselectors;
  8213.     regs.w.ax=0;
  8214.     int386(0x31,®s,®s);
  8215.     if (regs.w.cflag&1)
  8216.         {
  8217.         puts("Error allocating selectors");
  8218.         return(-1);                                    
  8219.         }
  8220.     return(regs.w.ax);
  8221.     }
  8222.  
  8223. int setselector(word selector, BYTE *address, dword length)
  8224.     {
  8225.     union REGS regs;
  8226.     if (w95) address-=0x10000;
  8227.     regs.w.dx=(dword)address%65536;
  8228.     regs.w.cx=(dword)address/65536;
  8229.     regs.w.bx=selector;
  8230.     regs.w.ax=7;
  8231.     int386(0x31,®s,®s);
  8232.     if (regs.w.cflag&1)
  8233.         {
  8234.         puts("Error preparing selectors");
  8235.         return(-1);                                    
  8236.         }
  8237.     regs.w.dx=(length-1)%65536;
  8238.     regs.w.cx=(length-1)/65536;
  8239.     regs.w.bx=selector;
  8240.     regs.w.ax=8;
  8241.     int386(0x31,®s,®s);
  8242.     if (regs.w.cflag&1)
  8243.         {
  8244.         printf("Error preparing selectors");
  8245.         return(-1);                                    
  8246.         }
  8247.     return(0);
  8248.     }
  8249.  
  8250. int freeselector(word selector)
  8251.     {
  8252.     union REGS regs;
  8253.     regs.w.bx=selector;
  8254.     regs.w.ax=1;
  8255.     int386(0x31,®s,®s);
  8256.     if (regs.w.cflag&1)
  8257.         {
  8258.         puts("Error freeing selectors");
  8259.         return(-1);                                    
  8260.         }
  8261.     return(0);
  8262.     }
  8263.  
  8264. word nextselectordisp(word selector)
  8265.     {
  8266.     union REGS regs;
  8267.     regs.w.ax=3;
  8268.     int386(0x31,®s,®s);
  8269.     return(regs.w.ax);
  8270.     }                                
  8271.  
  8272. // Object 'constructor' function
  8273. void initobj(obj *object,ptlist points,facelist faces,datapt x,datapt y,datapt z,floatpt crot,floatpt srot)
  8274.     {
  8275.     object->points=points;
  8276.     object->faces=faces;
  8277.     object->x=x;
  8278.     object->y=y;
  8279.     object->z=z;
  8280.     object->crot=crot;
  8281.     object->srot=srot;
  8282.     };
  8283.  
  8284.  
  8285. int skyno;
  8286.  
  8287. int init3d()
  8288.     {
  8289.     int i,j,mc_tot;
  8290.     word selector;
  8291.     BYTE *seg;
  8292.     BYTE *tptr,*tptr2;
  8293.     word *stp;
  8294.     dword *tlptr;
  8295.  
  8296.     maps=NULL,scrb=NULL,sky=NULL,textures=NULL,filters=NULL,player_p=NULL,plyrtwtb=NULL;
  8297.     objlist=NULL,pollist=NULL,ptslist=NULL,rotlist=NULL,anim_data=NULL;
  8298.     fd=NULL;
  8299.     for (i=0;i<MAPPAGES+noloop+2;i++)
  8300.         mapsel[i]=-1;
  8301.  
  8302.     // Free memory?
  8303.     if (setup.verbose) {printf("Free memory = %d\n",get_mem_info());fflush(stdout);}
  8304.  
  8305.     // Malloc data areas
  8306.     if (setup.verbose) {puts("Preparing memory areas...");fflush(stdout);}
  8307.     if (setup.M8)
  8308.         mcaps=mcaps8;
  8309.     else
  8310.         mcaps=mcaps4;
  8311.     mc_tot=0;
  8312.     for (i=0;i<MC_NO;i++)
  8313.         {
  8314.         mcaps[i].cappts=mc_tot;
  8315.         mc_tot+=mcaps[i].capfrms;
  8316.         }
  8317.     if (setup.verbose) {printf("Motion capture frames: %d\n",mc_tot);fflush(stdout);}
  8318.     if (setup.M8)
  8319.         {
  8320.         if (
  8321.              (maps=(mappage *)mallocx((mappages=MAPPAGES)*65536)) == NULL ||
  8322.              (scrb=(BYTE *)mallocx(640*482)) == NULL ||
  8323.              (sky=(BYTE *)mallocx(640*482)) == NULL ||
  8324.              (textures=(texture *)mallocx((NOTEXTURES+CLIP_TEXTURES+1)*sizeof(texture))) == NULL ||
  8325.              (filters=(filter *)mallocx(FILTERS*sizeof(filter))) == NULL ||
  8326.              (player_p=(capfrm *)mallocx(mc_tot*sizeof(capfrm))) == NULL ||
  8327.              (plyrtwtb=(plyrtwdat *)mallocx(NPLAYERS*sizeof(plyrtwdat))) == NULL ||
  8328.              (objlist=(objs *)mallocx(MAXOBJ*sizeof(objs))) == NULL ||
  8329.              (pollist=(pols *)mallocx(MAXPOL*sizeof(pols))) == NULL ||
  8330.              (ptslist=(scrpt *)mallocx(MAXPOL*10*sizeof(scrpt))) == NULL ||
  8331.              (rotlist=(rotpt *)mallocx(MAXPTS*4*sizeof(rotpt))) == NULL ||
  8332.              (anim_data=(char *)mallocx(ANIM_SPACE)) == NULL )
  8333.             {
  8334.             puts("Error reserving memory");
  8335.              goto init3d_error;
  8336.             }
  8337.         }
  8338.     else
  8339.         {
  8340.         setup.start_res=0;
  8341.         if (
  8342.              (maps=(mappage *)mallocx((mappages=MAPPAGES_4)*65536)) == NULL ||
  8343.              (scrb=(BYTE *)mallocx(320*202)) == NULL ||
  8344.              (textures=(texture *)mallocx((NOTEXTURES+CLIP_TEXTURES+1)*sizeof(texture))) == NULL ||
  8345.              (filters=(filter *)mallocx(FILTERS*sizeof(filter))) == NULL ||
  8346.              (player_p=(capfrm *)mallocx(mc_tot*sizeof(capfrm))) == NULL ||
  8347.              (plyrtwtb=(plyrtwdat *)mallocx(NPLAYERS*sizeof(plyrtwdat))) == NULL ||
  8348.              (objlist=(objs *)mallocx(MAXOBJ*sizeof(objs))) == NULL ||
  8349.              (pollist=(pols *)mallocx(MAXPOL*sizeof(pols))) == NULL ||
  8350.              (ptslist=(scrpt *)mallocx(MAXPOL*10*sizeof(scrpt))) == NULL ||
  8351.              (rotlist=(rotpt *)mallocx(MAXPTS*4*sizeof(rotpt))) == NULL )
  8352.             {
  8353.             puts("Error reserving memory");
  8354.              goto init3d_error;
  8355.             }
  8356.         }
  8357.  
  8358.  
  8359.     // Load texture maps and other files
  8360.     if (setup.verbose) {puts("Reading data files...");fflush(stdout);}
  8361.       if (readrawfile(dataoffs,(BYTE *)load_offsets) == NULL) goto init3d_error;
  8362.     if (opendatafile(datafile) < 0 ) goto init3d_error;
  8363.  
  8364.  
  8365.     if (setup.detail.stadia||network_on) 
  8366.         {
  8367.         if (network_on)
  8368.             {
  8369.             setup.detail.stadia=1;
  8370.             setup.stadium+=45;
  8371.             }
  8372.         else
  8373.             if (stadlist[setup.stadium+90].tmdfile==-1||performance<=18)
  8374.                 setup.stadium+=45;
  8375.             else
  8376.                 setup.stadium+=90;
  8377.         }
  8378.  
  8379.  
  8380. #ifdef LINK
  8381.     skyno=stadlist[setup.stadium].skytypes[(count&1)?1:0];
  8382. #else
  8383.     skyno=stadlist[setup.stadium].skytypes[(rand()&1)?1:0];
  8384. #endif
  8385.  
  8386.     if (setup.M8)
  8387.     {
  8388.         if (
  8389.             readfile(PAL_FOOTY,pal) == NULL ||
  8390.              readfile(TMD_TEXDATA,(BYTE *)&textures[1]) == NULL
  8391.             )
  8392.              goto init3d_error;
  8393.         if (
  8394.             readfile(teamlist[setup.team_a].headfile,maps[0]) == NULL ||
  8395.             readfile(teamlist[setup.team_b].headfile,maps[0]+128*256) == NULL ||
  8396.             readfile(teamlist[setup.team_a].torsofile,maps[1]) == NULL ||
  8397.             readfile(teamlist[setup.team_b_kit].torsofile,maps[2]) == NULL ||
  8398.             readfile(teamlist[setup.team_a].limbsfile,maps[3]) == NULL ||
  8399.             readfile(teamlist[setup.team_b_kit].limbsfile,maps[3]+80*256) == NULL ||
  8400.             readfile(BM_FEET,maps[3]+158*256) == NULL ||
  8401.             readfile(BM_REFKPTOR,maps[4]) == NULL ||
  8402.             readfile(BM_EXTRA1,maps[X_BM]) == NULL ||
  8403.            readfile(teamlist[setup.team_a].nosfile,maps[X_BM]+62*256) == NULL ||
  8404.             readfile(BM_EXTRA3,maps[X_BM+1]) == NULL ||
  8405.             readfile(stadlist[setup.stadium].sb1file,maps[S_BM]) == NULL ||
  8406.            readfile(stadlist[setup.stadium].sb2file,maps[S_BM+1]) == NULL ||
  8407.             readfile(teamlist[setup.team_a].torsofile,maps[S_BM+2]) == NULL ||
  8408.             readfile(teamlist[setup.team_b_kit].torsofile,maps[S_BM+3]) == NULL ||
  8409.             readfile(BM_XLIMBS,maps[S_BM+4]) == NULL ||
  8410.             readfile(teamlist[setup.team_a].limbsfile,maps[S_BM+4]) == NULL ||
  8411.             readfile(teamlist[setup.team_b_kit].limbsfile,maps[S_BM+4]+80*256) == NULL ||
  8412.             readfile(BM_XRFKPLIM,maps[S_BM+5]) == NULL ||
  8413.             readfile(BM_REFKPTOR,maps[S_BM+6]) == NULL ||
  8414. #ifdef NEW
  8415.             readfile(BM_NETS,maps[S_BM+7]) == NULL ||
  8416. #endif
  8417.             readfile(teamlist[setup.team_a].palfile,&pal[3*32]) == NULL ||
  8418.             readfile(teamlist[setup.team_b_kit].palfile,&pal[3*56]) == NULL ||
  8419.             readfile(teamlist[setup.team_a].skinfile,&pal[3*80]) == NULL ||
  8420.             readfile(teamlist[setup.team_b].skinfile,&pal[3*88]) == NULL ||
  8421.             readfile(stadlist[setup.stadium].pitchpfile,&pal[3*128]) == NULL ||
  8422.             readfile(teamlist[setup.team_a].homepfile,&pal[3*224]) == NULL ||
  8423.             readfile(teamlist[setup.team_b].awaypfile,&pal[3*232]) == NULL ||
  8424.             readfile(skylist[skyno].skypfile,&pal[3*208]) == NULL ||
  8425.            readfile(skylist[skyno].skyfile,sky) == NULL
  8426.             )
  8427.              goto init3d_error;
  8428.  
  8429.         int st_a0;
  8430.         int st_b0_kit;
  8431. //        st_a0=14;//setup.team_a?36:14;
  8432. //        st_b0_kit=36;//setup.team_b_kit?36:14;
  8433.         st_a0=setup.team_a;
  8434.         st_b0_kit=setup.team_b_kit;
  8435.  
  8436.         switch(st_a0/42)
  8437.             {
  8438.             case 0: if (readfile(BM_KGRIDS1,maps[5])==NULL) goto init3d_error; break;
  8439. #ifndef BBS
  8440.             case 1: if (readfile(BM_KGRIDS2,maps[5])==NULL) goto init3d_error; break;
  8441. #endif
  8442.             }
  8443.         j=st_a0%42;
  8444.         tptr=maps[5]+((j/7)*42+1)*256+(j%7)*36+1;
  8445.         tptr2=maps[X_BM+1]+111*256+220;
  8446.         for (i=0;i<40;i++)
  8447.             {
  8448.             memcpy(tptr2,tptr,35);
  8449.             tptr+=256;
  8450.             tptr2+=256;
  8451.             }
  8452.         switch(st_b0_kit/42)
  8453.             {
  8454.             case 0: if (readfile(BM_KGRIDS1,maps[5])==NULL) goto init3d_error; break;
  8455. #ifndef BBS
  8456.             case 1: if (readfile(BM_KGRIDS2,maps[5])==NULL) goto init3d_error; break;
  8457. #endif
  8458.             }
  8459.         j=st_b0_kit%42;
  8460.         tptr=maps[5]+((j/7)*42+1)*256+(j%7)*36+1;
  8461.         tptr2=maps[X_BM+1]+151*256+220;
  8462.         for (i=0;i<40;i++)
  8463.             {
  8464.             memcpy(tptr2,tptr,35);
  8465.             tptr+=256;
  8466.             tptr2+=256;
  8467.             }
  8468.         switch(st_a0/9)
  8469.             {
  8470.             case 0: if (readfile(BM_KGRID1,maps[5])==NULL) goto init3d_error; break;
  8471. #ifndef BBS
  8472.             case 1: if (readfile(BM_KGRID2,maps[5])==NULL) goto init3d_error; break;
  8473.             case 2: if (readfile(BM_KGRID3,maps[5])==NULL) goto init3d_error; break;
  8474.             case 3: if (readfile(BM_KGRID4,maps[5])==NULL) goto init3d_error; break;
  8475.             case 4: if (readfile(BM_KGRID5,maps[5])==NULL) goto init3d_error; break;
  8476.             case 5: if (readfile(BM_KGRID6,maps[5])==NULL) goto init3d_error; break;
  8477. #endif
  8478.             }
  8479.         j=st_a0%9;
  8480.         tptr=maps[5]+((j/3)*83+2)*256+(j%3)*70+1;
  8481.         tptr2=maps[X_BM+1];
  8482.         for (i=0;i<79;i++)
  8483.             {
  8484.             memcpy(tptr2,tptr,69);
  8485.             tptr+=256;
  8486.             tptr2+=256;
  8487.             }
  8488.         switch(st_b0_kit/9)
  8489.             {
  8490.             case 0: if (readfile(BM_KGRID1,maps[5])==NULL) goto init3d_error; break;
  8491. #ifndef BBS
  8492.             case 1: if (readfile(BM_KGRID2,maps[5])==NULL) goto init3d_error; break;
  8493.             case 2: if (readfile(BM_KGRID3,maps[5])==NULL) goto init3d_error; break;
  8494.             case 3: if (readfile(BM_KGRID4,maps[5])==NULL) goto init3d_error; break;
  8495.             case 4: if (readfile(BM_KGRID5,maps[5])==NULL) goto init3d_error; break;
  8496.             case 5: if (readfile(BM_KGRID6,maps[5])==NULL) goto init3d_error; break;
  8497. #endif
  8498.             }
  8499.         j=st_b0_kit%9;
  8500.         tptr=maps[5]+((j/3)*83+2)*256+(j%3)*70+1;
  8501.         tptr2=maps[X_BM+1]+69;
  8502.         for (i=0;i<79;i++)
  8503.             {
  8504.             memcpy(tptr2,tptr,69);
  8505.             tptr+=256;
  8506.             tptr2+=256;
  8507.             }
  8508.         if (readfile(BM_REFKPLIM,maps[5]) == NULL) goto init3d_error;
  8509.  
  8510.         tptr=maps[X_BM]+89*256+161;
  8511.         for (i=0;i<27;i++)
  8512.             {
  8513.             memcpy(tptr+91*256,tptr,92);
  8514.             tptr+=256;
  8515.             }
  8516.        if (readfile(teamlist[setup.team_b_kit].nosfile,maps[X_BM]+89*256) == NULL) exit (1);
  8517.         tptr=maps[X_BM]+116*256+161;
  8518.         for (i=0;i<27;i++)
  8519.             {
  8520.             memcpy(tptr+64*256-92,tptr,92);
  8521.             tptr+=256;
  8522.             }
  8523.         if (readfile(stadlist[setup.stadium].pitchfile,maps[X_BM]+116*256) == NULL) exit (1);
  8524.         tptr=maps[X_BM]+180*256+69;
  8525.         for (i=0;i<27;i++)
  8526.             {
  8527.             memcpy(tptr-64*256,tptr,184);
  8528.             tptr+=256;
  8529.             }
  8530.         if (readfile(BM_EXTRA2,maps[X_BM]+180*256) == NULL) exit (1);
  8531.         if (
  8532.             readfile(stadlist[setup.stadium].tmdfile,(BYTE *)&textures[S_TM]) == NULL ||
  8533.              readfile(stadlist[setup.stadium].s1pfile,(BYTE *)&stad1_p) == NULL ||
  8534.              readfile(stadlist[setup.stadium].s1ffile,(BYTE *)&stad1_f) == NULL ||
  8535.              readfile(stadlist[setup.stadium].s2pfile,(BYTE *)&stad2_p) == NULL ||
  8536.              readfile(stadlist[setup.stadium].s2ffile,(BYTE *)&stad2_f) == NULL ||
  8537.              readfile(stadlist[setup.stadium].s3pfile,(BYTE *)&stad3_p) == NULL ||
  8538.              readfile(stadlist[setup.stadium].s3ffile,(BYTE *)&stad3_f) == NULL ||
  8539.              readfile(stadlist[setup.stadium].s4pfile,(BYTE *)&stad4_p) == NULL ||
  8540.              readfile(stadlist[setup.stadium].s4ffile,(BYTE *)&stad4_f) == NULL
  8541.             )
  8542.              goto init3d_error;
  8543.         if (
  8544.             readfile(MPB_AFOOTB,(BYTE *)&player_p[mcaps[MC_AFOOTB].cappts]) == NULL ||
  8545.             readfile(MPB_AFOOTC,(BYTE *)&player_p[mcaps[MC_AFOOTC].cappts]) == NULL ||
  8546.             readfile(MPB_ABODYB,(BYTE *)&player_p[mcaps[MC_ABODYB].cappts]) == NULL ||
  8547.             readfile(MPB_ABODYC,(BYTE *)&player_p[mcaps[MC_ABODYC].cappts]) == NULL ||
  8548.             readfile(MPB_AHEADB,(BYTE *)&player_p[mcaps[MC_AHEADB].cappts]) == NULL ||
  8549.             readfile(MPB_AHEADC,(BYTE *)&player_p[mcaps[MC_AHEADC].cappts]) == NULL ||
  8550.             readfile(MPB_AJUMPB,(BYTE *)&player_p[mcaps[MC_AJUMPB].cappts]) == NULL ||
  8551.             readfile(MPB_AJUMPC,(BYTE *)&player_p[mcaps[MC_AJUMPC].cappts]) == NULL ||
  8552.             readfile(MPB_BFOOTB,(BYTE *)&player_p[mcaps[MC_BFOOTBL].cappts]) == NULL ||
  8553.             readfile(MPB_BFOOTC,(BYTE *)&player_p[mcaps[MC_BFOOTCL].cappts]) == NULL ||
  8554.             readfile(MPB_BBODYB,(BYTE *)&player_p[mcaps[MC_BBODYBL].cappts]) == NULL ||
  8555.             readfile(MPB_BBODYC,(BYTE *)&player_p[mcaps[MC_BBODYCL].cappts]) == NULL ||
  8556.             readfile(MPB_BHEADB,(BYTE *)&player_p[mcaps[MC_BHEADBL].cappts]) == NULL ||
  8557.             readfile(MPB_BHEADC,(BYTE *)&player_p[mcaps[MC_BHEADCL].cappts]) == NULL ||
  8558.             readfile(MPB_BJUMPB,(BYTE *)&player_p[mcaps[MC_BJUMPBL].cappts]) == NULL ||
  8559.             readfile(MPB_CFOOTB,(BYTE *)&player_p[mcaps[MC_CFOOTBL].cappts]) == NULL || 
  8560.             readfile(MPB_CFOOTC,(BYTE *)&player_p[mcaps[MC_CFOOTCL].cappts]) == NULL || 
  8561.             readfile(MPB_CBODYB,(BYTE *)&player_p[mcaps[MC_CBODYBL].cappts]) == NULL ||
  8562.             readfile(MPB_CBODYC,(BYTE *)&player_p[mcaps[MC_CBODYCL].cappts]) == NULL ||
  8563.             readfile(MPB_CHEADB,(BYTE *)&player_p[mcaps[MC_CHEADBL].cappts]) == NULL ||
  8564.             readfile(MPB_CJUMPB,(BYTE *)&player_p[mcaps[MC_CJUMPBL].cappts]) == NULL || 
  8565.             readfile(MPB_SHOOT1,(BYTE *)&player_p[mcaps[MC_SHOOTR].cappts]) == NULL ||
  8566.             readfile(MPB_CHIP1,(BYTE *)&player_p[mcaps[MC_CHIPR].cappts]) == NULL ||
  8567.             readfile(MPB_SPASS1,(BYTE *)&player_p[mcaps[MC_PASSR].cappts]) == NULL ||
  8568.             readfile(MPB_CROSS1,(BYTE *)&player_p[mcaps[MC_CROSSR].cappts]) == NULL ||
  8569.             readfile(MPB_VOLLEY,(BYTE *)&player_p[mcaps[MC_VOLLEYR].cappts]) == NULL ||
  8570. //            readfile(MPB_TOE2,(BYTE *)&player_p[mcaps[MC_TOER].cappts]) == NULL ||
  8571.             readfile(MPB_DIAGPASS,(BYTE *)&player_p[mcaps[MC_DIAGPASSR].cappts]) == NULL ||
  8572.             readfile(MPB_DIAGBACK,(BYTE *)&player_p[mcaps[MC_DIAGBACKR].cappts]) == NULL ||
  8573.             readfile(MPB_SIDEPASS,(BYTE *)&player_p[mcaps[MC_SIDEPASSR].cappts]) == NULL ||
  8574.             readfile(MPB_BACKHEEL,(BYTE *)&player_p[mcaps[MC_BACKHEELR].cappts]) == NULL ||
  8575.             readfile(MPB_SVTOSTD,(BYTE *)&player_p[mcaps[MC_STOSL].cappts]) == NULL ||
  8576.             readfile(MPB_SVTOSTB,(BYTE *)&player_p[mcaps[MC_STOSBL].cappts]) == NULL ||
  8577.             readfile(MPB_TRAP,(BYTE *)&player_p[mcaps[MC_TRAPR].cappts]) == NULL ||
  8578.             readfile(MPB_RIDE4,(BYTE *)&player_p[mcaps[MC_RIDEL].cappts]) == NULL ||
  8579.             readfile(MPB_SOCKS2,(BYTE *)&player_p[mcaps[MC_SOCKSR].cappts]) == NULL ||
  8580.             readfile(MPB_TROTB,(BYTE *)&player_p[mcaps[MC_TROTB].cappts]) == NULL ||
  8581.             readfile(MPB_TROTG,(BYTE *)&player_p[mcaps[MC_TROTG].cappts]) == NULL ||
  8582.             readfile(MPB_TROTD1,(BYTE *)&player_p[mcaps[MC_TROTD].cappts]) == NULL ||
  8583.             readfile(MPB_TROTA,(BYTE *)&player_p[mcaps[MC_TROTA].cappts]) == NULL ||
  8584.             readfile(MPB_TROTE,(BYTE *)&player_p[mcaps[MC_TROTE].cappts]) == NULL ||
  8585.             readfile(MPB_RUN2,(BYTE *)&player_p[mcaps[MC_RUN].cappts]) == NULL ||
  8586.             readfile(MPB_JOG1,(BYTE *)&player_p[mcaps[MC_JOG].cappts]) == NULL ||
  8587.             readfile(MPB_BARGE,(BYTE *)&player_p[mcaps[MC_BARGE].cappts]) == NULL ||
  8588.             readfile(MPB_THROWW,(BYTE *)&player_p[mcaps[MC_THROWW].cappts]) == NULL ||
  8589. //            readfile(MPB_SHAMEW,(BYTE *)&player_p[mcaps[MC_SHAMEW].cappts]) == NULL ||
  8590. //            readfile(MPB_LIE1,(BYTE *)&player_p[mcaps[MC_LIE].cappts]) == NULL ||
  8591.             readfile(MPB_STAND1,(BYTE *)&player_p[mcaps[MC_STAND].cappts]) == NULL  ||
  8592.             readfile(MPB_SHEADER,(BYTE *)&player_p[mcaps[MC_S_HEAD].cappts]) == NULL ||
  8593.             readfile(MPB_JHEADER,(BYTE *)&player_p[mcaps[MC_J_HEAD].cappts]) == NULL ||
  8594.             readfile(MPB_HDOWN1,(BYTE *)&player_p[mcaps[MC_D_HEAD].cappts]) == NULL ||
  8595. //            readfile(MPB_HEADUP,(BYTE *)&player_p[mcaps[MC_U_HEAD].cappts]) == NULL ||
  8596.             readfile(MPB_DHEADER,(BYTE *)&player_p[mcaps[MC_DV_HEAD].cappts]) == NULL ||
  8597.             readfile(MPB_CHEST1,(BYTE *)&player_p[mcaps[MC_CHEST].cappts]) == NULL ||
  8598.             readfile(MPB_STACKLE,(BYTE *)&player_p[mcaps[MC_S_TACKLE].cappts]) == NULL ||
  8599.             readfile(MPB_STEAL2,(BYTE *)&player_p[mcaps[MC_STEAL].cappts]) == NULL ||
  8600.             readfile(MPB_OVERHEAD,(BYTE *)&player_p[mcaps[MC_OVERHEAD].cappts]) == NULL ||
  8601.             readfile(MPB_THROWL,(BYTE *)&player_p[mcaps[MC_THROWL].cappts]) == NULL ||
  8602.             readfile(MPB_THROWS,(BYTE *)&player_p[mcaps[MC_THROWS].cappts]) == NULL ||
  8603.             readfile(MPB_FALLR,(BYTE *)&player_p[mcaps[MC_FALLR].cappts]) == NULL ||
  8604. //            readfile(MPB_FALLS,(BYTE *)&player_p[mcaps[MC_FALLS].cappts]) == NULL ||
  8605.             readfile(MPB_CELEB,(BYTE *)&player_p[mcaps[MC_CELEB].cappts]) == NULL ||
  8606. //            readfile(MPB_SHAME1,(BYTE *)&player_p[mcaps[MC_SHAME].cappts]) == NULL ||
  8607.             readfile(MPB_GETUP,(BYTE *)&player_p[mcaps[MC_GETUP].cappts]) == NULL ||
  8608.             readfile(MPB_GETUPF,(BYTE *)&player_p[mcaps[MC_GETUPF].cappts]) == NULL ||
  8609.             readfile(MPB_STANDB,(BYTE *)&player_p[mcaps[MC_STANDB].cappts]) == NULL ||
  8610.             readfile(MPB_BOUNCE,(BYTE *)&player_p[mcaps[MC_BOUNCE].cappts]) == NULL ||
  8611.             readfile(MPB_KICKOUT,(BYTE *)&player_p[mcaps[MC_KICKOUT].cappts]) == NULL ||
  8612.             readfile(MPB_HALFVOLL,(BYTE *)&player_p[mcaps[MC_HALFVOLL].cappts]) == NULL ||
  8613.             readfile(MPB_THROW,(BYTE *)&player_p[mcaps[MC_THROW].cappts]) == NULL ||
  8614.             readfile(MPB_ROLL,(BYTE *)&player_p[mcaps[MC_ROLL].cappts]) == NULL || 
  8615.             readfile(MPB_RUNWITHB,(BYTE *)&player_p[mcaps[MC_RUNWITHB].cappts]) == NULL || 
  8616.             readfile(MPB_WAVEUP,(BYTE *)&player_p[mcaps[MC_WAVEUP].cappts]) == NULL || 
  8617. //            readfile(MPB_PENALTY,(BYTE *)&player_p[mcaps[MC_PENALTY].cappts]) == NULL ||
  8618. //            readfile(MPB_PLEAD,(BYTE *)&player_p[mcaps[MC_PLEAD].cappts]) == NULL ||
  8619.             readfile(MPB_CRTOSTB1,(BYTE *)&player_p[mcaps[MC_CRTOSTB].cappts]) == NULL ||
  8620.             readfile(MPB_PICKBALL,(BYTE *)&player_p[mcaps[MC_PICKBALL].cappts]) == NULL
  8621. #ifdef NEW
  8622.        || readfile(MPB_DUCK,(BYTE *)&player_p[mcaps[MC_DUCK].cappts]) == NULL ||
  8623.             readfile(MPB_FINGER,(BYTE *)&player_p[mcaps[MC_FINGER].cappts]) == NULL ||
  8624.             readfile(MPB_KNEE,(BYTE *)&player_p[mcaps[MC_KNEE].cappts]) == NULL ||
  8625.             readfile(MPB_PLANE,(BYTE *)&player_p[mcaps[MC_PLANE].cappts]) == NULL ||
  8626.             readfile(MPB_MILLER,(BYTE *)&player_p[mcaps[MC_MILLER].cappts]) == NULL ||
  8627.             readfile(MPB_BABY,(BYTE *)&player_p[mcaps[MC_BABY].cappts]) == NULL ||
  8628.             readfile(MPB_MOON,(BYTE *)&player_p[mcaps[MC_MOON].cappts]) == NULL ||
  8629.             readfile(MPB_PUMP,(BYTE *)&player_p[mcaps[MC_PUMP].cappts]) == NULL ||
  8630.             readfile(MPB_REEVES,(BYTE *)&player_p[mcaps[MC_REEVES].cappts]) == NULL
  8631. #endif
  8632.             )
  8633.              goto init3d_error;
  8634.     }
  8635.     else                
  8636.         {
  8637.         if (
  8638.             readfile(PAL_FOOTY,pal) == NULL ||
  8639.              readfile(TMD_TEXDATA,(BYTE *)&textures[1]) == NULL
  8640.             )
  8641.              goto init3d_error;
  8642.         if (
  8643.             readfile(teamlist[setup.team_a].headfile,maps[0]) == NULL ||
  8644.             readfile(teamlist[setup.team_b].headfile,maps[0]+128*256) == NULL ||
  8645.             readfile(teamlist[setup.team_a].torsofile,maps[1]) == NULL ||
  8646.             readfile(teamlist[setup.team_b_kit].torsofile,maps[2]) == NULL ||
  8647.             readfile(teamlist[setup.team_a].limbsfile,maps[3]) == NULL ||
  8648.             readfile(teamlist[setup.team_b_kit].limbsfile,maps[3]+80*256) == NULL ||
  8649.             readfile(BM_FEET,maps[3]+158*256) == NULL ||
  8650.             readfile(BM_REFKPTOR,maps[4]) == NULL ||
  8651.             readfile(BM_EXTRA1,maps[X_BM]) == NULL ||
  8652.            readfile(teamlist[setup.team_a].nosfile,maps[X_BM]+62*256) == NULL ||
  8653.             readfile(BM_EXTRA3,maps[X_BM+1]) == NULL ||
  8654.            readfile(stadlist[setup.stadium].sb1file,maps[S_BM]) == NULL ||
  8655.            readfile(stadlist[setup.stadium].sb2file,maps[S_BM+1]) == NULL ||
  8656.             readfile(teamlist[setup.team_a].palfile,&pal[3*32]) == NULL ||
  8657.             readfile(teamlist[setup.team_b_kit].palfile,&pal[3*56]) == NULL ||
  8658.             readfile(teamlist[setup.team_a].skinfile,&pal[3*80]) == NULL ||
  8659.             readfile(teamlist[setup.team_b].skinfile,&pal[3*88]) == NULL ||
  8660.             readfile(stadlist[setup.stadium].pitchpfile,&pal[3*128]) == NULL ||
  8661.             readfile(teamlist[setup.team_a].homepfile,&pal[3*224]) == NULL ||
  8662.             readfile(teamlist[setup.team_b].awaypfile,&pal[3*232]) == NULL
  8663.             )
  8664.              goto init3d_error;
  8665.  
  8666.         int st_a1;
  8667.         int st_b1_kit;
  8668. //        st_a1=14;//setup.team_a?36:14;
  8669. //        st_b1_kit=36;//setup.team_b_kit?36:14;
  8670.         st_a1=setup.team_a;
  8671.         st_b1_kit=setup.team_b_kit;
  8672.  
  8673.         switch(st_a1/42)
  8674.             {
  8675.             case 0: if (readfile(BM_KGRIDS1,maps[5])==NULL) goto init3d_error; break;
  8676. #ifndef BBS
  8677.             case 1: if (readfile(BM_KGRIDS2,maps[5])==NULL) goto init3d_error; break;
  8678. #endif
  8679.             }
  8680.         j=st_a1%42;
  8681.         tptr=maps[5]+((j/7)*42+1)*256+(j%7)*36+1;
  8682.         tptr2=maps[X_BM+1]+111*256+220;
  8683.         for (i=0;i<40;i++)
  8684.             {
  8685.             memcpy(tptr2,tptr,35);
  8686.             tptr+=256;
  8687.             tptr2+=256;
  8688.             }
  8689.         switch(st_b1_kit/42)
  8690.             {
  8691.             case 0: if (readfile(BM_KGRIDS1,maps[5])==NULL) goto init3d_error; break;
  8692. #ifndef BBS
  8693.             case 1: if (readfile(BM_KGRIDS2,maps[5])==NULL) goto init3d_error; break;
  8694. #endif
  8695.             }
  8696.         j=st_b1_kit%42;
  8697.         tptr=maps[5]+((j/7)*42+1)*256+(j%7)*36+1;
  8698.         tptr2=maps[X_BM+1]+151*256+220;
  8699.         for (i=0;i<40;i++)
  8700.             {
  8701.             memcpy(tptr2,tptr,35);
  8702.             tptr+=256;
  8703.             tptr2+=256;
  8704.             }
  8705.         switch(st_a1/9)
  8706.             {
  8707.             case 0: if (readfile(BM_KGRID1,maps[5])==NULL) goto init3d_error; break;
  8708. #ifndef BBS
  8709.             case 1: if (readfile(BM_KGRID2,maps[5])==NULL) goto init3d_error; break;
  8710.             case 2: if (readfile(BM_KGRID3,maps[5])==NULL) goto init3d_error; break;
  8711.             case 3: if (readfile(BM_KGRID4,maps[5])==NULL) goto init3d_error; break;
  8712.             case 4: if (readfile(BM_KGRID5,maps[5])==NULL) goto init3d_error; break;
  8713.             case 5: if (readfile(BM_KGRID6,maps[5])==NULL) goto init3d_error; break;
  8714. #endif
  8715.             }
  8716.         j=st_a1%9;
  8717.         tptr=maps[5]+((j/3)*83+2)*256+(j%3)*70+1;
  8718.         tptr2=maps[X_BM+1];
  8719.         for (i=0;i<79;i++)
  8720.             {
  8721.             memcpy(tptr2,tptr,69);
  8722.             tptr+=256;
  8723.             tptr2+=256;
  8724.             }
  8725.         switch(st_b1_kit/9)
  8726.             {
  8727.             case 0: if (readfile(BM_KGRID1,maps[5])==NULL) goto init3d_error; break;
  8728. #ifndef BBS
  8729.             case 1: if (readfile(BM_KGRID2,maps[5])==NULL) goto init3d_error; break;
  8730.             case 2: if (readfile(BM_KGRID3,maps[5])==NULL) goto init3d_error; break;
  8731.             case 3: if (readfile(BM_KGRID4,maps[5])==NULL) goto init3d_error; break;
  8732.             case 4: if (readfile(BM_KGRID5,maps[5])==NULL) goto init3d_error; break;
  8733.             case 5: if (readfile(BM_KGRID6,maps[5])==NULL) goto init3d_error; break;
  8734. #endif
  8735.             }
  8736.         j=st_b1_kit%9;
  8737.         tptr=maps[5]+((j/3)*83+2)*256+(j%3)*70+1;
  8738.         tptr2=maps[X_BM+1]+69;
  8739.         for (i=0;i<79;i++)
  8740.             {
  8741.             memcpy(tptr2,tptr,69);
  8742.             tptr+=256;
  8743.             tptr2+=256;
  8744.             }
  8745.         if (readfile(BM_REFKPLIM,maps[5]) == NULL) goto init3d_error;
  8746.  
  8747.         tptr=maps[X_BM]+89*256+161;
  8748.         for (i=0;i<27;i++)
  8749.             {
  8750.             memcpy(tptr+91*256,tptr,92);
  8751.             tptr+=256;
  8752.             }
  8753.        if (readfile(teamlist[setup.team_b_kit].nosfile,maps[X_BM]+89*256) == NULL) exit (1);
  8754.           tptr=maps[X_BM]+116*256+161;
  8755.         for (i=0;i<27;i++)
  8756.             {
  8757.             memcpy(tptr+64*256-92,tptr,92);
  8758.             tptr+=256;
  8759.             }
  8760.         if (readfile(stadlist[setup.stadium].pitchfile,maps[X_BM]+116*256) == NULL) exit (1);
  8761.         tptr=maps[X_BM]+180*256+69;
  8762.         for (i=0;i<27;i++)
  8763.             {
  8764.             memcpy(tptr-64*256,tptr,184);
  8765.             tptr+=256;
  8766.             }
  8767.         if (readfile(BM_EXTRA2,maps[X_BM]+180*256) == NULL) exit (1);
  8768.         if (
  8769.             readfile(stadlist[setup.stadium].tmdfile,(BYTE *)&textures[S_TM]) == NULL ||
  8770.              readfile(stadlist[setup.stadium].s1pfile,(BYTE *)&stad1_p) == NULL ||
  8771.              readfile(stadlist[setup.stadium].s1ffile,(BYTE *)&stad1_f) == NULL ||
  8772.              readfile(stadlist[setup.stadium].s2pfile,(BYTE *)&stad2_p) == NULL ||
  8773.               readfile(stadlist[setup.stadium].s2ffile,(BYTE *)&stad2_f) == NULL ||
  8774.              readfile(stadlist[setup.stadium].s3pfile,(BYTE *)&stad3_p) == NULL ||
  8775.              readfile(stadlist[setup.stadium].s3ffile,(BYTE *)&stad3_f) == NULL ||
  8776.              readfile(stadlist[setup.stadium].s4pfile,(BYTE *)&stad4_p) == NULL ||
  8777.              readfile(stadlist[setup.stadium].s4ffile,(BYTE *)&stad4_f) == NULL
  8778.             )
  8779.              goto init3d_error;
  8780.         if (
  8781.             readfile(MP4_AFOOTB,(BYTE *)&player_p[mcaps[MC_AFOOTB].cappts]) == NULL ||
  8782.             readfile(MP4_AFOOTC,(BYTE *)&player_p[mcaps[MC_AFOOTC].cappts]) == NULL ||
  8783.             readfile(MP4_ABODYB,(BYTE *)&player_p[mcaps[MC_ABODYB].cappts]) == NULL ||
  8784.             readfile(MP4_ABODYC,(BYTE *)&player_p[mcaps[MC_ABODYC].cappts]) == NULL ||
  8785.             readfile(MP4_AHEADB,(BYTE *)&player_p[mcaps[MC_AHEADB].cappts]) == NULL ||
  8786.             readfile(MP4_AHEADC,(BYTE *)&player_p[mcaps[MC_AHEADC].cappts]) == NULL ||
  8787.             readfile(MP4_AJUMPB,(BYTE *)&player_p[mcaps[MC_AJUMPB].cappts]) == NULL ||
  8788.             readfile(MP4_AJUMPC,(BYTE *)&player_p[mcaps[MC_AJUMPC].cappts]) == NULL ||
  8789.             readfile(MP4_BFOOTB,(BYTE *)&player_p[mcaps[MC_BFOOTBL].cappts]) == NULL ||
  8790.             readfile(MP4_BFOOTC,(BYTE *)&player_p[mcaps[MC_BFOOTCL].cappts]) == NULL ||
  8791.             readfile(MP4_BBODYB,(BYTE *)&player_p[mcaps[MC_BBODYBL].cappts]) == NULL ||
  8792.             readfile(MP4_BBODYC,(BYTE *)&player_p[mcaps[MC_BBODYCL].cappts]) == NULL ||
  8793.             readfile(MP4_BHEADB,(BYTE *)&player_p[mcaps[MC_BHEADBL].cappts]) == NULL ||
  8794.             readfile(MP4_BHEADC,(BYTE *)&player_p[mcaps[MC_BHEADCL].cappts]) == NULL ||
  8795.             readfile(MP4_BJUMPB,(BYTE *)&player_p[mcaps[MC_BJUMPBL].cappts]) == NULL ||
  8796.             readfile(MP4_CFOOTB,(BYTE *)&player_p[mcaps[MC_CFOOTBL].cappts]) == NULL || 
  8797.             readfile(MP4_CFOOTC,(BYTE *)&player_p[mcaps[MC_CFOOTCL].cappts]) == NULL || 
  8798.             readfile(MP4_CBODYB,(BYTE *)&player_p[mcaps[MC_CBODYBL].cappts]) == NULL ||
  8799.             readfile(MP4_CBODYC,(BYTE *)&player_p[mcaps[MC_CBODYCL].cappts]) == NULL ||
  8800.             readfile(MP4_CHEADB,(BYTE *)&player_p[mcaps[MC_CHEADBL].cappts]) == NULL ||
  8801.             readfile(MP4_CJUMPB,(BYTE *)&player_p[mcaps[MC_CJUMPBL].cappts]) == NULL || 
  8802.             readfile(MP4_SHOOT1,(BYTE *)&player_p[mcaps[MC_SHOOTR].cappts]) == NULL ||
  8803.             readfile(MP4_CHIP1,(BYTE *)&player_p[mcaps[MC_CHIPR].cappts]) == NULL ||
  8804.             readfile(MP4_SPASS1,(BYTE *)&player_p[mcaps[MC_PASSR].cappts]) == NULL ||
  8805.             readfile(MP4_CROSS1,(BYTE *)&player_p[mcaps[MC_CROSSR].cappts]) == NULL ||
  8806.             readfile(MP4_VOLLEY,(BYTE *)&player_p[mcaps[MC_VOLLEYR].cappts]) == NULL ||
  8807. //            readfile(MP4_TOE2,(BYTE *)&player_p[mcaps[MC_TOER].cappts]) == NULL ||
  8808.             readfile(MP4_DIAGPASS,(BYTE *)&player_p[mcaps[MC_DIAGPASSR].cappts]) == NULL ||
  8809.             readfile(MP4_DIAGBACK,(BYTE *)&player_p[mcaps[MC_DIAGBACKR].cappts]) == NULL ||
  8810.             readfile(MP4_SIDEPASS,(BYTE *)&player_p[mcaps[MC_SIDEPASSR].cappts]) == NULL ||
  8811.             readfile(MP4_BACKHEEL,(BYTE *)&player_p[mcaps[MC_BACKHEELR].cappts]) == NULL ||
  8812.             readfile(MP4_SVTOSTD,(BYTE *)&player_p[mcaps[MC_STOSL].cappts]) == NULL ||
  8813.             readfile(MP4_SVTOSTB,(BYTE *)&player_p[mcaps[MC_STOSBL].cappts]) == NULL ||
  8814.             readfile(MP4_TRAP,(BYTE *)&player_p[mcaps[MC_TRAPR].cappts]) == NULL ||
  8815.             readfile(MP4_RIDE4,(BYTE *)&player_p[mcaps[MC_RIDEL].cappts]) == NULL ||
  8816.             readfile(MP4_SOCKS2,(BYTE *)&player_p[mcaps[MC_SOCKSR].cappts]) == NULL ||
  8817.             readfile(MP4_TROTB,(BYTE *)&player_p[mcaps[MC_TROTB].cappts]) == NULL ||
  8818.             readfile(MP4_TROTG,(BYTE *)&player_p[mcaps[MC_TROTG].cappts]) == NULL ||
  8819.             readfile(MP4_TROTD1,(BYTE *)&player_p[mcaps[MC_TROTD].cappts]) == NULL ||
  8820.             readfile(MP4_TROTA,(BYTE *)&player_p[mcaps[MC_TROTA].cappts]) == NULL ||
  8821.             readfile(MP4_TROTE,(BYTE *)&player_p[mcaps[MC_TROTE].cappts]) == NULL ||
  8822.             readfile(MP4_RUN2,(BYTE *)&player_p[mcaps[MC_RUN].cappts]) == NULL ||
  8823.             readfile(MP4_JOG1,(BYTE *)&player_p[mcaps[MC_JOG].cappts]) == NULL ||
  8824.             readfile(MP4_BARGE,(BYTE *)&player_p[mcaps[MC_BARGE].cappts]) == NULL ||
  8825.             readfile(MP4_THROWW,(BYTE *)&player_p[mcaps[MC_THROWW].cappts]) == NULL ||
  8826. //            readfile(MP4_SHAMEW,(BYTE *)&player_p[mcaps[MC_SHAMEW].cappts]) == NULL ||
  8827. //            readfile(MP4_LIE1,(BYTE *)&player_p[mcaps[MC_LIE].cappts]) == NULL ||
  8828.             readfile(MP4_STAND1,(BYTE *)&player_p[mcaps[MC_STAND].cappts]) == NULL  ||
  8829.             readfile(MP4_SHEADER,(BYTE *)&player_p[mcaps[MC_S_HEAD].cappts]) == NULL ||
  8830.             readfile(MP4_JHEADER,(BYTE *)&player_p[mcaps[MC_J_HEAD].cappts]) == NULL ||
  8831.             readfile(MP4_HDOWN1,(BYTE *)&player_p[mcaps[MC_D_HEAD].cappts]) == NULL ||
  8832. //            readfile(MP4_HEADUP,(BYTE *)&player_p[mcaps[MC_U_HEAD].cappts]) == NULL ||
  8833.             readfile(MP4_DHEADER,(BYTE *)&player_p[mcaps[MC_DV_HEAD].cappts]) == NULL ||
  8834.             readfile(MP4_CHEST1,(BYTE *)&player_p[mcaps[MC_CHEST].cappts]) == NULL ||
  8835.             readfile(MP4_STACKLE,(BYTE *)&player_p[mcaps[MC_S_TACKLE].cappts]) == NULL ||
  8836.             readfile(MP4_STEAL2,(BYTE *)&player_p[mcaps[MC_STEAL].cappts]) == NULL ||
  8837.             readfile(MP4_OVERHEAD,(BYTE *)&player_p[mcaps[MC_OVERHEAD].cappts]) == NULL ||
  8838.             readfile(MP4_THROWL,(BYTE *)&player_p[mcaps[MC_THROWL].cappts]) == NULL ||
  8839.             readfile(MP4_THROWS,(BYTE *)&player_p[mcaps[MC_THROWS].cappts]) == NULL ||
  8840.             readfile(MP4_FALLR,(BYTE *)&player_p[mcaps[MC_FALLR].cappts]) == NULL ||
  8841. //            readfile(MP4_FALLS,(BYTE *)&player_p[mcaps[MC_FALLS].cappts]) == NULL ||
  8842.             readfile(MP4_CELEB,(BYTE *)&player_p[mcaps[MC_CELEB].cappts]) == NULL ||
  8843. //            readfile(MP4_SHAME1,(BYTE *)&player_p[mcaps[MC_SHAME].cappts]) == NULL ||
  8844.             readfile(MP4_GETUP,(BYTE *)&player_p[mcaps[MC_GETUP].cappts]) == NULL ||
  8845.             readfile(MP4_GETUPF,(BYTE *)&player_p[mcaps[MC_GETUPF].cappts]) == NULL ||
  8846.             readfile(MP4_STANDB,(BYTE *)&player_p[mcaps[MC_STANDB].cappts]) == NULL ||
  8847.             readfile(MP4_BOUNCE,(BYTE *)&player_p[mcaps[MC_BOUNCE].cappts]) == NULL ||
  8848.             readfile(MP4_KICKOUT,(BYTE *)&player_p[mcaps[MC_KICKOUT].cappts]) == NULL ||
  8849.             readfile(MP4_HALFVOLL,(BYTE *)&player_p[mcaps[MC_HALFVOLL].cappts]) == NULL ||
  8850.             readfile(MP4_THROW,(BYTE *)&player_p[mcaps[MC_THROW].cappts]) == NULL ||
  8851.             readfile(MP4_ROLL,(BYTE *)&player_p[mcaps[MC_ROLL].cappts]) == NULL || 
  8852.             readfile(MP4_RUNWITHB,(BYTE *)&player_p[mcaps[MC_RUNWITHB].cappts]) == NULL || 
  8853.             readfile(MP4_WAVEUP,(BYTE *)&player_p[mcaps[MC_WAVEUP].cappts]) == NULL || 
  8854. //            readfile(MP4_PENALTY,(BYTE *)&player_p[mcaps[MC_PENALTY].cappts]) == NULL ||
  8855. //            readfile(MP4_PLEAD,(BYTE *)&player_p[mcaps[MC_PLEAD].cappts]) == NULL ||
  8856.             readfile(MP4_CRTOSTB1,(BYTE *)&player_p[mcaps[MC_CRTOSTB].cappts]) == NULL ||
  8857.             readfile(MP4_PICKBALL,(BYTE *)&player_p[mcaps[MC_PICKBALL].cappts]) == NULL
  8858.             )
  8859.              goto init3d_error;
  8860.         }
  8861.     closedatafile();
  8862.  
  8863.  
  8864.     // Making simple pitch
  8865.     st_w=stadlist[setup.stadium].st_w;
  8866.     st_l=stadlist[setup.stadium].st_l;
  8867.     st_h=stadlist[setup.stadium].st_h;
  8868.     for (i=0;i<19;i++)
  8869.         {
  8870.         pitch_p[1+i*3+2]=st_w;
  8871.         pitch_p[1+(i+19)*3+2]=-800-st_w;
  8872.         }
  8873.     pitch_p[1]=-st_l;
  8874.     pitch_p[1+19*3]=-st_l;
  8875.     pitch_p[1+18*3]=1280+st_l;
  8876.     pitch_p[1+37*3]=1280+st_l;
  8877.  
  8878.                                  
  8879.     // Remapping textures
  8880.     if (setup.verbose) {puts("Remapping textures...");fflush(stdout);}
  8881.     tlptr=(dword *)&textures[0];
  8882.     for (i=0;i<(NOTEXTURES+1)*8;i++) *tlptr++&=0xffffff00; // Correct unchecked carry in texture mapping (not a bug!)
  8883.     tptr=maps[0]+128*256;
  8884.     for (i=0;i<128*256;i++)
  8885.         {
  8886.         if (*tptr>=80 && *tptr<88) *tptr+=8;
  8887.         tptr++;
  8888.         }
  8889.     tptr=maps[2];
  8890.     for (i=0;i<65536;i++)
  8891.         {
  8892.         if (*tptr>=32 && *tptr<56) *tptr+=24;
  8893.         if (*tptr>=80 && *tptr<88) *tptr+=8;
  8894.         tptr++;
  8895.         }
  8896.     tptr=maps[3]+80*256;
  8897.     for (i=0;i<80*256;i++)
  8898.         {
  8899.         if (*tptr>=32 && *tptr<56) *tptr+=24;
  8900.         if (*tptr>=80 && *tptr<88) *tptr+=8;
  8901.         tptr++;
  8902.         }
  8903.     tptr=maps[X_BM]+89*256;
  8904.     for (i=0;i<27*256;i++)
  8905.         {
  8906.         if (*tptr>32 && *tptr<=56) *tptr+=24;
  8907.         if (*tptr>80 && *tptr<=88) *tptr+=8;
  8908.         tptr++;
  8909.         }
  8910.     tptr=maps[X_BM]+116*256+69;
  8911.     for (i=0;i<27;i++)
  8912.         {
  8913.         for (j=0;j<92;j++)
  8914.             {
  8915.             if (*tptr>32 && *tptr<=56) *tptr+=24;
  8916.             if (*tptr>80 && *tptr<=88) *tptr+=8;
  8917.             tptr++;
  8918.             }
  8919.         tptr+=164;
  8920.         }
  8921.     if (setup.M8)
  8922.         {
  8923.         tptr=maps[S_BM+2];
  8924.         for (i=0;i<65536;i++)
  8925.             {
  8926.             if (*tptr>=80 && *tptr<88) *tptr+=16;
  8927.             tptr++;
  8928.             }
  8929.         tptr=maps[S_BM+3];
  8930.         for (i=0;i<65536;i++)
  8931.             {
  8932.             if (*tptr>=32 && *tptr<56) *tptr+=24;
  8933.             if (*tptr>=80 && *tptr<88) *tptr+=16;
  8934.             tptr++;
  8935.             }
  8936.         tptr=maps[S_BM+4];
  8937.         for (i=0;i<(78*256);i++)
  8938.             {
  8939.             if (*tptr>=80 && *tptr<88) *tptr+=16;
  8940.             tptr++;
  8941.             }
  8942.         tptr=maps[S_BM+4]+80*256;
  8943.         for (i=0;i<(78*256);i++)
  8944.             {
  8945.             if (*tptr>=32 && *tptr<56) *tptr+=24;
  8946.             if (*tptr>=80 && *tptr<88) *tptr+=16;
  8947.             tptr++;
  8948.             }
  8949.         tptr=maps[S_BM+5];
  8950.         for (i=0;i<2*65536;i++)
  8951.             {
  8952.             if (*tptr>=80 && *tptr<88) *tptr+=8;
  8953.             tptr++;
  8954.             }
  8955.         }
  8956.  
  8957.  
  8958.       // Screen dump (640X400)
  8959.     if (EUROmatch_info.tga_enable&&setup.M8) 
  8960.         {
  8961.         if ((dumplbm=readrawfile("hires.tga",NULL)) == NULL) exit (1);
  8962.         for (i=0;i<256;i++)
  8963.             {
  8964.             *(dumplbm+0x12+i*3)=pal[i*3+2]<<2;
  8965.             *(dumplbm+0x12+i*3+1)=pal[i*3+1]<<2;
  8966.             *(dumplbm+0x12+i*3+2)=pal[i*3]<<2;
  8967.             }
  8968.         }
  8969.  
  8970.  
  8971.     // Prepare segment selectors for texture maps
  8972.     if (setup.verbose) {puts("Preparing segment selectors...");fflush(stdout);}
  8973. //    if ((selector=getselectors(mappages+stadlist[setup.stadium].noloop+2)) < 0)
  8974.     if ((selector=getselectors(mappages+noloop+2)) < 0)
  8975.         {
  8976.         puts("Error preparing selectors");
  8977.         goto init3d_error;
  8978.         }
  8979.     for (i=0;i<mappages;i++)
  8980.         {
  8981.         mapsel[i]=selector;
  8982.         seg=maps[i];
  8983.         if (setselector(selector,seg,65536) < 0)
  8984.             {
  8985.             puts("Error setting selectors");
  8986.             goto init3d_error;
  8987.             }
  8988.         selector+=nextselectordisp(selector);
  8989.         }
  8990.  
  8991.     for (i=mappages;i<mappages+noloop;i++)
  8992.         {
  8993.         mapsel[i]=selector;
  8994.         seg=maps[X_BM+(texloop[i-mappages].pos>>16)]+(texloop[i-mappages].pos&0xffff);
  8995.         if (setselector(selector,seg,65536) < 0)
  8996.             {
  8997.             puts("Error setting selectors");
  8998.             goto init3d_error;
  8999.             }
  9000.         selector+=nextselectordisp(selector);
  9001.         }
  9002.     /*
  9003.     for (i=mappages;i<mappages+stadlist[setup.stadium].noloop;i++)
  9004.         {
  9005.         mapsel[i]=selector;
  9006.         seg=maps[S_BM+(stadlist[setup.stadium].loop[i-mappages]>>16)]+(stadlist[setup.stadium].loop[i-mappages]&0xffff);
  9007.         if (setselector(selector,seg,65536) < 0)
  9008.             {
  9009.             puts("Error setting selectors");
  9010.             goto init3d_error;
  9011.             }
  9012.         selector+=nextselectordisp(selector);
  9013.         }
  9014.     */
  9015.       mapsel[i]=selector;
  9016.       seg=maps[X_BM]+148*256+64;
  9017.       if (setselector(selector,seg,65536) < 0)
  9018.           {
  9019.           puts("Error setting selectors");
  9020.         goto init3d_error;
  9021.           }
  9022.     selector+=nextselectordisp(selector);
  9023.       mapsel[i+1]=selector;
  9024.       seg=maps[X_BM]+116*256;
  9025.       if (setselector(selector,seg,65536) < 0)
  9026.           {
  9027.           puts("Error setting selectors");
  9028.         goto init3d_error;
  9029.           }
  9030.  
  9031.     // Free memory?
  9032.     if (setup.verbose) {printf("Free memory = %d\n",get_mem_info());fflush(stdout);}
  9033.     
  9034.     // Prepare filters
  9035.     if (setup.verbose) {puts("Making colour filters...");fflush(stdout);}
  9036.     makefilter(filters[0],0,0,0,0.5,0.5,0.5);
  9037.     makefilter(filters[1],48,48,48,.5,.5,.5);
  9038.  
  9039.  
  9040.     // Initialise objects
  9041.     if (setup.verbose) {puts("Intialising data objects...");fflush(stdout);}
  9042.  
  9043.     // Set players  
  9044.     for (i=0;i<11;i++)    
  9045.         initobj(&player[i],player_p[0],player_f1,0,0,0,1,0);
  9046.                                                     
  9047.     for (i=11;i<22;i++)
  9048.         initobj(&player[i],player_p[0],player_f2,0,0,0,1,0);
  9049.  
  9050.     initobj(&player[22],player_p[0],player_fr,0,0,0,1,0);
  9051.     initobj(&player[23],player_p[0],player_fl,0,0,0,1,0);
  9052.     initobj(&player[24],player_p[0],player_fl,0,0,0,1,0);
  9053.  
  9054.     // Prepare player tweening
  9055.     for (i=0;i<NPLAYERS;i++)
  9056.         {
  9057.         plyrtwtb[i].anim=MC_STAND;
  9058.         plyrtwtb[i].tween=-1;
  9059.         plyrtwtb[i].twnfrm=player[0].points;
  9060.         *plyrtwtb[i].twnpts1=*plyrtwtb[i].twnpts2=PLYRPTS;
  9061.         }
  9062.  
  9063.     // Set player shadows/highlights
  9064.     initobj(&plhilight[0][0],plshad_p,plshad_f,0,0,0,1,0);
  9065.     initobj(&plhilight[1][0],plhi_p,plhi1_f1,0,0,0,1,0);
  9066.     initobj(&plhilight[2][0],plhi_p,plhi2_f1,0,0,0,1,0);
  9067.     initobj(&plhilight[3][0],plhi_p,plhi3_f1,0,0,0,1,0);
  9068.     initobj(&plhilight[4][0],plhi_p,plhi3_f1,0,0,0,1,0);
  9069.     initobj(&plhilight[5][0],plhi_p,plhi4_f1,0,0,0,1,0);
  9070.     initobj(&plhilight[6][0],plhi_p,plhi4_f1,0,0,0,1,0);
  9071.     initobj(&plhilight[0][1],plshad_p,plshad_f,0,0,0,1,0);
  9072.     initobj(&plhilight[1][1],plhi_p,plhi1_f2,0,0,0,1,0);
  9073.     initobj(&plhilight[2][1],plhi_p,plhi2_f2,0,0,0,1,0);
  9074.     initobj(&plhilight[3][1],plhi_p,plhi3_f2,0,0,0,1,0);
  9075.     initobj(&plhilight[4][1],plhi_p,plhi3_f2,0,0,0,1,0);
  9076.     initobj(&plhilight[5][1],plhi_p,plhi4_f2,0,0,0,1,0);
  9077.     initobj(&plhilight[6][1],plhi_p,plhi4_f2,0,0,0,1,0);
  9078.     initobj(&plhilight[0][2],plshad_p,plshad_f,0,0,0,1,0);
  9079.     initobj(&plhilight[1][2],plhi_p,plhi1_f3,0,0,0,1,0);
  9080.     initobj(&plhilight[2][2],plhi_p,plhi2_f3,0,0,0,1,0);
  9081.     initobj(&plhilight[3][2],plhi_p,plhi3_f3,0,0,0,1,0);
  9082.     initobj(&plhilight[4][2],plhi_p,plhi3_f3,0,0,0,1,0);
  9083.     initobj(&plhilight[5][2],plhi_p,plhi4_f3,0,0,0,1,0);
  9084.     initobj(&plhilight[6][2],plhi_p,plhi4_f3,0,0,0,1,0);
  9085.     initobj(&plhilight[0][3],plshad_p,plshad_f,0,0,0,1,0);
  9086.     initobj(&plhilight[1][3],plhi_p,plhi1_f4,0,0,0,1,0);
  9087.     initobj(&plhilight[2][3],plhi_p,plhi2_f4,0,0,0,1,0);
  9088.     initobj(&plhilight[3][3],plhi_p,plhi3_f4,0,0,0,1,0);
  9089.     initobj(&plhilight[4][3],plhi_p,plhi3_f4,0,0,0,1,0);
  9090.     initobj(&plhilight[5][3],plhi_p,plhi4_f4,0,0,0,1,0);
  9091.     initobj(&plhilight[6][3],plhi_p,plhi4_f4,0,0,0,1,0);
  9092.     initobj(&plhilight[0][4],plshad_p,plshad_f,0,0,0,1,0);
  9093.     initobj(&plhilight[1][4],plhi_p,plhi1_f5,0,0,0,1,0);
  9094.     initobj(&plhilight[2][4],plhi_p,plhi2_f5,0,0,0,1,0);
  9095.     initobj(&plhilight[3][4],plhi_p,plhi3_f5,0,0,0,1,0);
  9096.     initobj(&plhilight[4][4],plhi_p,plhi3_f5,0,0,0,1,0);
  9097.     initobj(&plhilight[5][4],plhi_p,plhi4_f5,0,0,0,1,0);
  9098.     initobj(&plhilight[6][4],plhi_p,plhi4_f5,0,0,0,1,0);
  9099.     initobj(&plhilight[0][5],plshad_p,plshad_f,0,0,0,1,0);
  9100.     initobj(&plhilight[1][5],plhi_p,plhi1_ff,0,0,0,1,0);
  9101.     initobj(&plhilight[2][5],plhi_p,plhi2_ff,0,0,0,1,0);
  9102.     initobj(&plhilight[3][5],plhi_p,plhi3_ff,0,0,0,1,0);
  9103.     initobj(&plhilight[4][5],plhi_p,plhi3_ff,0,0,0,1,0);
  9104.     initobj(&plhilight[5][5],plhi_p,plhi4_ff,0,0,0,1,0);
  9105.     initobj(&plhilight[6][5],plhi_p,plhi4_ff,0,0,0,1,0);
  9106.  
  9107.     // Set ball
  9108.     initobj(&ball,footy_p,footy_f,640,0,-400,1,0);
  9109.  
  9110.     // Set ball shadow 
  9111.     initobj(&ballshad,ballshad_p,ballshad_f,640,0,-400,1,0);
  9112.  
  9113.     // Set simple pitch
  9114.     initobj(&pitch,pitch_p,pitch_f,0,0,0,1,0);
  9115.     
  9116.     // Set pitch lines
  9117.     initobj(&l1,l1_p1,l_f1a,210,0,-200,1,0);
  9118.     initobj(&l2,l2_p1,l_f1a,1070,0,-200,1,0);
  9119.     initobj(&l3,l3_p1,l_f1a,1070,0,-600,1,0);
  9120.     initobj(&l4,l4_p1,l_f1a,210,0,-600,1,0);
  9121.     initobj(&l5,l5_p1,l_f3a,640,0,-200,1,0);
  9122.     initobj(&l6,l6_p1,l_f3a,640,0,-600,1,0);
  9123.     initobj(&circle,circle_pa,circle_fa,640,0,-400,1,0);
  9124.     initobj(&semi1,s_circle_p1a,s_circle_f1a,123,0,-400,1,0);
  9125.     initobj(&semi2,s_circle_p2a,s_circle_f2a,1157,0,-400,1,0);
  9126.     initobj(&spot1,spot_p,spot_f,640,0,-400,1,0);
  9127.     initobj(&spot2,spot_p,spot_f,128,0,-400,1,0);
  9128.     initobj(&spot3,spot_p,spot_f,1152,0,-400,1,0);
  9129.  
  9130.     // Set goals
  9131.     initobj(&goal1_1,goal1a_p,goal_f1a,0,0,-443.5,1,0);
  9132.     initobj(&goal2_1,goal1a_p,goal_f1a,0,0,-356.5,1,0);
  9133.     initobj(&goal3_1,goal1a_p,goal_f1a,0,37,-400,1,0);
  9134.     initobj(&goal4_1,goal1a_p,goal_f1a,-28,0,-400,1,0);
  9135.     initobj(&goal1_2,goal1a_p,goal_f1a,1280,0,-443.5,1,0);
  9136.     initobj(&goal2_2,goal1a_p,goal_f1a,1280,0,-356.5,1,0);
  9137.     initobj(&goal3_2,goal1a_p,goal_f1a,1280,37,-400,1,0);
  9138.     initobj(&goal4_2,goal1a_p,goal_f1a,1308,0,-400,1,0);
  9139.  
  9140.     // Set flags
  9141.     initobj(&flag_1,flag_p,flag_f,0,0,0,1,0);
  9142.     initobj(&flag_2,flag_p,flag_f,1280,0,0,1,0);
  9143.     initobj(&flag_3,flag_p,flag_f,0,0,-800,1,0);
  9144.     initobj(&flag_4,flag_p,flag_f,1280,0,-800,1,0);
  9145.  
  9146.     // Set stands
  9147.     initobj(&stad1,stad1_p,stad1_f, stadlist[setup.stadium].s1x,stadlist[setup.stadium].s1y,stadlist[setup.stadium].s1z,1,0);
  9148.     initobj(&stad2,stad2_p,stad2_f, stadlist[setup.stadium].s2x,stadlist[setup.stadium].s2y,stadlist[setup.stadium].s2z,1,0);
  9149.     initobj(&stad3,stad3_p,stad3_f, stadlist[setup.stadium].s3x,stadlist[setup.stadium].s3y,stadlist[setup.stadium].s3z,1,0);
  9150.     initobj(&stad4,stad4_p,stad4_f, stadlist[setup.stadium].s4x,stadlist[setup.stadium].s4y,stadlist[setup.stadium].s4z,1,0);
  9151.     stp=stad1_f;
  9152.     i=*stp++;
  9153.     for(;i;i--)
  9154.     {
  9155.         j=*stp++;
  9156.         if (*stp<0) *stp-=S_TM-1;
  9157.         stp++;
  9158.         for (;j;j--) stp++;
  9159.     }
  9160.     stp=stad2_f;
  9161.     i=*stp++;
  9162.     for(;i;i--)
  9163.     {
  9164.         j=*stp++;
  9165.         if (*stp<0) *stp-=S_TM-1;
  9166.         stp++;
  9167.         for (;j;j--) stp++;
  9168.     }
  9169.     stp=stad3_f;
  9170.     i=*stp++;
  9171.     for(;i;i--)
  9172.     {
  9173.         j=*stp++;
  9174.         if (*stp<0) *stp-=S_TM-1;
  9175.         stp++;
  9176.         for (;j;j--) stp++;
  9177.     }
  9178.     stp=stad4_f;
  9179.     i=*stp++;
  9180.     for(;i;i--)
  9181.     {
  9182.         j=*stp++;
  9183.         if (*stp<0) *stp-=S_TM-1;
  9184.         stp++;
  9185.         for (;j;j--) stp++;
  9186.     }
  9187.  
  9188.     // Initialise animations
  9189.     buff_ptr=(char *)(maps[S_BM])+stadlist[setup.stadium].vmap;
  9190.     vidi_anim=0;
  9191.     vidi_in=0;
  9192.       if (readrawfile(fapoffs,(BYTE *)load_offsets) == NULL) goto init3d_error;
  9193.     if (opendatafile(fapfile) < 0) goto init3d_error;
  9194.     if (setup.M8) 
  9195.         {
  9196. #ifdef JAPAN
  9197.         readfile(FAP_VIJAP,(BYTE *)anim_data);
  9198. #else
  9199. #ifdef AMERICA
  9200.         readfile(FAP_VR,(BYTE *)anim_data);
  9201. #else
  9202.         readfile(FAP_VIDI,(BYTE *)anim_data);
  9203. #endif
  9204. #endif
  9205.         init_anim(vidi,0);
  9206.         }
  9207. #ifdef AMERICA
  9208.     readfile(COL_VR,(BYTE *)&pal[240*3]);
  9209. #endif
  9210.  
  9211.  
  9212.     // Prepare miscellaneous data
  9213.     if (setup.verbose) {puts("Preparing miscellaneous data...");fflush(stdout);}
  9214.     
  9215.  
  9216.     // Set screen mode and set buffer info
  9217.     if (setup.verbose) {puts("Geting VESA information...");fflush(stdout);}
  9218. //    MCGA_buff.buff_start=(BYTE *)0xa0000;
  9219.     for (i=0;i<SCRSIZES;i++)
  9220.         {
  9221.         MCGA_buff[i].buff_start=scrb+320+((320-MCGA_buff[i].clip_wid)>>1)+((200-MCGA_buff[i].clip_hgt)>>1)*320;
  9222.         for (j=0;j<VESAMODES;j++)
  9223.             VESA_buff[j][i].buff_start=scrb+640+((VESA_buff[j][i].buff_wid-VESA_buff[j][i].clip_wid)>>1)+((VESA_buff[j][i].buff_hgt-VESA_buff[j][i].clip_hgt)>>1)*VESA_buff[j][i].buff_wid;
  9224.         }
  9225.     for (i=0;i<MODES_3DB;i++)
  9226.          buff_3DB[i].buff_start=scrb;
  9227.     if (setup.stadium>=90)
  9228.         {
  9229.         vidi_buff_1.buff_start=maps[S_BM]+7*256+10;
  9230.         vidi_buff_2.buff_start=maps[S_BM]+7*256+10;
  9231.         }
  9232.     else
  9233.         {
  9234.         vidi_buff_1.buff_start=maps[S_BM]+14*256+51;
  9235.         vidi_buff_2.buff_start=maps[S_BM]+14*256+51;
  9236.         }
  9237.     if (setup.vidi_type==0)
  9238.         vidi_buff=vidi_buff_1;
  9239.     else
  9240.         vidi_buff=vidi_buff_2;
  9241.     for (i=0;i<NO_MENUS;i++)
  9242.         {
  9243.         menu_buff_l[i].scale_x=(MCGA_buff[0].clip_wid-menu_buff_l[i].clip_wid)>>1;
  9244.         menu_buff_l[i].scale_y=MCGA_buff[0].clip_hgt-menu_buff_l[i].buff_hgt;
  9245.         menu_buff_l[i].buff_start=MCGA_buff[0].buff_start+(int)menu_buff_l[i].scale_y*MCGA_buff[0].buff_wid+(int)menu_buff_l[i].scale_x;
  9246.         menu_buff_h[i].scale_x=(VESA_buff[0][0].clip_wid-menu_buff_h[i].clip_wid)>>1;
  9247.         menu_buff_h[i].scale_y=VESA_buff[0][0].clip_hgt-menu_buff_h[i].buff_hgt;
  9248.         menu_buff_h[i].buff_start=VESA_buff[0][0].buff_start+(int)menu_buff_h[i].scale_y*VESA_buff[0][0].buff_wid+(int)menu_buff_h[i].scale_x;
  9249.         }
  9250.  
  9251.     return (0);
  9252.  
  9253.     init3d_error:;
  9254.     end3d();
  9255.     return (-1);
  9256.  
  9257.     }
  9258.  
  9259.  
  9260. void
  9261. setscreen()
  9262.     {
  9263.     int i,j,k,pf;
  9264.     int taddr,taddr1;
  9265.  
  9266. #ifdef BLASTER
  9267.     if ((scrmode3DB=Init3DB(modelist3DB))<0)
  9268. #else
  9269.     if (1)
  9270. #endif
  9271.         {
  9272.         init3DB_error:;
  9273.         scrmode3DB=-1;
  9274.         remapgfx(1);
  9275.         if (setup.start_res==0)
  9276.             {
  9277.             scrmode=0x13;
  9278.             VGAmode(scrmode);
  9279.             main_buff=MCGA_buff[setup.screen_size];
  9280.             }
  9281.         else
  9282.             {
  9283.             testVESA=0;
  9284.             scrmode=VESAmode(&modelist[0]);
  9285.             switch(scrmode)
  9286.                 {
  9287.                 case 0x100:main_buff=VESA_buff[0][setup.screen_size];break;
  9288.                 case 0x101:main_buff=VESA_buff[1][setup.screen_size];break;
  9289.                 default:VGAmode(0x13);main_buff=MCGA_buff[setup.screen_size];scrmode=0x13;
  9290.                 }
  9291.             }
  9292.  
  9293.         setup.start_res=(scrmode==0x13)?0:1;
  9294.  
  9295.         // Set palette
  9296.         setpal();
  9297.  
  9298.         // Clear screen
  9299.         switch(scrmode)
  9300.             {
  9301.             case 0x13:
  9302.                 vclear(scrb+320,320,200,320,5);
  9303.                 mcgacpy(scrb+320,0,0,320,200,320);
  9304.                 break;
  9305.             case 0x100:
  9306.                 vclear(scrb+640,640,400,640,5);
  9307.                 svgacpy(scrb+640,0,0,640,400,640);
  9308.                 break;
  9309.             case 0x101:
  9310.                 vclear(scrb+640,640,480,640,5);
  9311.                 svgacpy(scrb+640,0,0,640,480,640);
  9312.                 break;
  9313.             }
  9314.         }
  9315. #ifdef BLASTER
  9316.     else
  9317.         {
  9318.           if (readrawfile(dataoffs,(BYTE *)load_offsets) == NULL) goto init3DB_error;
  9319.         if (opendatafile(datafile) < 0 ) goto init3DB_error;
  9320.         switch(stadlist[setup.stadium].pitchfile)
  9321.             {
  9322.             case BM_PA: pf=BM_PT1;break;
  9323.             case BM_PB: pf=BM_PT2;break;
  9324.             case BM_PC: pf=BM_PT3;break;
  9325.             case BM_PD: pf=BM_PT4;break;
  9326.             }
  9327.         if (
  9328.             readfile(skylist[skyno].skypfile3DB,&pal[3*208]) == NULL ||
  9329.            readfile(skylist[skyno].skyfile3DB,sky) == NULL ||
  9330.             readfile(pf,pitch3DB) == NULL
  9331.             )
  9332.             goto init3DB_error;
  9333.         closedatafile();
  9334. #ifdef BLASTDEMO
  9335.         scrmode=(setup.start_res=(scrmode3DB>1)?1:0)?0x100:0x13;
  9336. #else
  9337.         scrmode=(setup.start_res=(scrmode3DB>0)?1:0)?0x100:0x13;
  9338. #endif
  9339.         main_buff=buff_3DB[scrmode3DB];
  9340.         pal[3]=pal[4]=pal[5]=63;
  9341.         pal[191*3]=pal[191*3+1]=pal[191*3+2]=0;
  9342.         SetPalette3DB(pal);
  9343.  
  9344.         // Load 3D Blaster textures
  9345.         remapxgfx(-1);
  9346.         for (i=0;i<mappages;i+=4)
  9347.             {
  9348. #ifdef RENDITION
  9349.             MapAddress3DB=i*64;
  9350. #else
  9351.             MapAddress3DB=-i*64;
  9352. #endif
  9353.             for (j=0;j<4&&(i+j)!=mappages;j++)
  9354.                 {
  9355.                 taddr=MapAddress3DB;
  9356.                 if ((texaddr3DB[i+j]=LoadTexture3DB((char *)maps[i+j],1024,256,256))<0)
  9357.                     goto init3DB_error;
  9358.                 MapAddress3DB=taddr+1024*256;
  9359.                 }
  9360.             }
  9361. //        MapAddress3DB=1024*1024;
  9362.         if ((skyaddr3DB=LoadTexture3DB((char *)sky,512,512,128))<0)
  9363.             goto init3DB_error;
  9364.         MapAddress3DB=1024*1024+128*512;
  9365.         if ((pitchaddr3DB=LoadTexture3DB((char *)pitch3DB,64,64,64))<0)
  9366.             goto init3DB_error;
  9367.         }
  9368. #endif
  9369.     }
  9370.  
  9371.  
  9372. void end3d()
  9373.     {
  9374.     int i;
  9375.     closedatafile();
  9376.     for (i=0;i<mappages+noloop+2;i++)
  9377.         {
  9378.         if (mapsel[i]!=-1)
  9379.             if (freeselector(mapsel[i]) < 0)
  9380.                 {
  9381.                 puts("Error freeing selectors");
  9382. //                exit(1);
  9383.                 }
  9384.         }
  9385.     if (EUROmatch_info.tga_enable&&setup.M8) freex(dumplbm);
  9386.     if (setup.M8) freex(anim_data);
  9387.     freex(rotlist);
  9388.     freex(ptslist);
  9389.     freex(pollist);
  9390.     freex(objlist);
  9391.     freex(plyrtwtb);
  9392.     freex(player_p);
  9393.     freex(filters);
  9394.     freex(textures);
  9395.     if (setup.M8) freex(sky);
  9396.     freex(scrb);
  9397.     freex(maps);
  9398.  
  9399.     if (scrmode3DB>=0)
  9400.         Close3DB();
  9401.  
  9402.     }
  9403.  
  9404.  
  9405.  
  9406. /****************/
  9407. /* TIME MACHINE */
  9408.  
  9409. void __far timetest(void) {performance++;};
  9410.  
  9411. /*
  9412. int timing()
  9413.     {
  9414.     float t;
  9415.     int c=0;
  9416.  
  9417.     performance=0;
  9418.     sosTIMERInitSystem(_TIMER_DOS_RATE,_SOS_DEBUG_NORMAL);
  9419.     sosTIMERRegisterEvent(100,timetest,&TimerHandle);
  9420.  
  9421.     for (i=0;i<100000;i++)
  9422.         {
  9423.         t=sin(c++);
  9424.         *(char *)0xa0000=(char)t;
  9425.         }
  9426.  
  9427.     sosTIMERRemoveEvent(TimerHandle);
  9428.     sosTIMERUnInitSystem(0);
  9429.     performance=2000/performance;
  9430.     }
  9431. */
  9432.  
  9433.  
  9434. int timing()
  9435.     {
  9436.     int i,j;
  9437.     word selector;
  9438.     BYTE *seg;
  9439.     word *stp;
  9440.     plyrdat *plyrwr,plyr[NPLAYERS+2];
  9441.     unsigned int TimerHandle;
  9442.     datapt dp[1]={0};
  9443.  
  9444.     timeit=1;
  9445.  
  9446.     setup.M8=0;
  9447.     setup.team_a=0;
  9448.     setup.team_b=setup.team_b_kit=1;
  9449.     setup.stadium=45;
  9450.     setup.vidi_type=0;
  9451.     setup.start_res=0;
  9452.     setup.screen_size=0;
  9453.     setup.detail.stadia=1;
  9454.     setup.detail.pitch=1;
  9455.     setup.detail.lines=1;
  9456.     setup.detail.sky=1;
  9457.     setup.detail.players=1;
  9458.     setup.detail.shadows=1;
  9459.  
  9460.     if (
  9461.          (maps=(mappage *)mallocx((mappages=MAPPAGES_4)*65536)) == NULL ||
  9462.          (scrb=(BYTE *)mallocx(320*202)) == NULL ||
  9463.          (textures=(texture *)mallocx((NOTEXTURES+CLIP_TEXTURES+1)*sizeof(texture))) == NULL ||
  9464.          (filters=(filter *)mallocx(FILTERS*sizeof(filter))) == NULL ||
  9465.          (player_p=(capfrm *)mallocx(100*sizeof(capfrm))) == NULL ||
  9466.          (plyrtwtb=(plyrtwdat *)mallocx(NPLAYERS*sizeof(plyrtwdat))) == NULL ||
  9467.          (objlist=(objs *)mallocx(MAXOBJ*sizeof(objs))) == NULL ||
  9468.          (pollist=(pols *)mallocx(MAXPOL*sizeof(pols))) == NULL ||
  9469.          (ptslist=(scrpt *)mallocx(MAXPOL*10*sizeof(scrpt))) == NULL ||
  9470.          (rotlist=(rotpt *)mallocx(MAXPTS*4*sizeof(rotpt))) == NULL )
  9471.         {
  9472.         puts("Error reserving memory");
  9473.         exit(-1);
  9474.         }
  9475.     mcaps=mcaps4;
  9476.  
  9477.     if (readrawfile(dataoffs,(BYTE *)load_offsets) == NULL)    exit(1);
  9478.     if (opendatafile(datafile)<0) return(-1);
  9479.  
  9480.     if (readfile(TMD_TEXDATA,(BYTE *)&textures[1]) == NULL) exit(1);
  9481.     if (
  9482.         readfile(stadlist[setup.stadium].tmdfile,(BYTE *)&textures[S_TM]) == NULL ||
  9483.          readfile(stadlist[setup.stadium].s1pfile,(BYTE *)&stad1_p) == NULL ||
  9484.          readfile(stadlist[setup.stadium].s1ffile,(BYTE *)&stad1_f) == NULL ||
  9485.          readfile(stadlist[setup.stadium].s2pfile,(BYTE *)&stad2_p) == NULL ||
  9486.          readfile(stadlist[setup.stadium].s2ffile,(BYTE *)&stad2_f) == NULL ||
  9487.          readfile(stadlist[setup.stadium].s3pfile,(BYTE *)&stad3_p) == NULL ||
  9488.          readfile(stadlist[setup.stadium].s3ffile,(BYTE *)&stad3_f) == NULL ||
  9489.          readfile(stadlist[setup.stadium].s4pfile,(BYTE *)&stad4_p) == NULL ||
  9490.          readfile(stadlist[setup.stadium].s4ffile,(BYTE *)&stad4_f) == NULL
  9491.         )
  9492.         exit(1);
  9493.     if (readfile(MP4_STAND1,(BYTE *)&player_p[0]) == NULL) exit(1);
  9494.     closedatafile();
  9495.  
  9496.     // Prepare segment selectors for texture maps
  9497.     if ((selector=getselectors(mappages+noloop+2)) < 0)
  9498.         {
  9499.         puts("Error preparing selectors");
  9500.         exit(2);
  9501.         }
  9502.     for (i=0;i<mappages;i++)
  9503.         {
  9504.         mapsel[i]=selector;
  9505.         seg=maps[i];
  9506.         if (setselector(selector,seg,65536) < 0)
  9507.             {
  9508.             puts("Error setting selectors");
  9509.             exit(3);
  9510.             }
  9511.         selector+=nextselectordisp(selector);
  9512.         }
  9513.  
  9514.     for (i=mappages;i<mappages+noloop;i++)
  9515.         {
  9516.         mapsel[i]=selector;
  9517.         seg=maps[X_BM+(texloop[i-mappages].pos>>16)]+(texloop[i-mappages].pos&0xffff);
  9518.         if (setselector(selector,seg,65536) < 0)
  9519.             {
  9520.             puts("Error setting selectors");
  9521.             exit(3);
  9522.             }
  9523.         selector+=nextselectordisp(selector);
  9524.         }
  9525.       mapsel[i]=selector;
  9526.       seg=maps[X_BM]+148*256+64;
  9527.       if (setselector(selector,seg,65536) < 0)
  9528.           {
  9529.           puts("Error setting selectors");
  9530.           exit(3);
  9531.           }
  9532.     selector+=nextselectordisp(selector);
  9533.       mapsel[i+1]=selector;
  9534.       seg=maps[X_BM]+116*256;
  9535.       if (setselector(selector,seg,65536) < 0)
  9536.           {
  9537.           puts("Error setting selectors");
  9538.           exit(3);
  9539.           }
  9540.  
  9541.     // Prepare filters
  9542.     makefilter(filters[0],0,0,0,0.5,0.5,0.5);
  9543.     makefilter(filters[1],48,48,48,.5,.5,.5);
  9544.  
  9545.  
  9546.     // Initialise objects
  9547.     // Set players  
  9548.     for (i=0;i<11;i++)    
  9549.         initobj(&player[i],player_p[0],player_f1,0,0,0,1,0);
  9550.                                                     
  9551.     for (i=11;i<22;i++)
  9552.         initobj(&player[i],player_p[0],player_f2,0,0,0,1,0);
  9553.  
  9554.     initobj(&player[22],player_p[0],player_fr,0,0,0,1,0);
  9555.     initobj(&player[23],player_p[0],player_fl,0,0,0,1,0);
  9556.     initobj(&player[24],player_p[0],player_fl,0,0,0,1,0);
  9557.  
  9558.     // Prepare player tweening
  9559.     for (i=0;i<NPLAYERS;i++)
  9560.         {
  9561.         plyrtwtb[i].anim=0;
  9562.         plyrtwtb[i].tween=-1;
  9563.         plyrtwtb[i].twnfrm=player[0].points;
  9564.         *plyrtwtb[i].twnpts1=*plyrtwtb[i].twnpts2=PLYRPTS;
  9565.         }
  9566.  
  9567.     // Set player shadows/highlights
  9568.     initobj(&plhilight[0][0],plshad_p,plshad_f,0,0,0,1,0);
  9569.     initobj(&plhilight[1][0],plhi_p,plhi1_f1,0,0,0,1,0);
  9570.     initobj(&plhilight[2][0],plhi_p,plhi2_f1,0,0,0,1,0);
  9571.     initobj(&plhilight[3][0],plhi_p,plhi3_f1,0,0,0,1,0);
  9572.     initobj(&plhilight[4][0],plhi_p,plhi3_f1,0,0,0,1,0);
  9573.     initobj(&plhilight[5][0],plhi_p,plhi4_f1,0,0,0,1,0);
  9574.     initobj(&plhilight[0][1],plshad_p,plshad_f,0,0,0,1,0);
  9575.     initobj(&plhilight[1][1],plhi_p,plhi1_f2,0,0,0,1,0);
  9576.     initobj(&plhilight[2][1],plhi_p,plhi2_f2,0,0,0,1,0);
  9577.     initobj(&plhilight[3][1],plhi_p,plhi3_f2,0,0,0,1,0);
  9578.     initobj(&plhilight[4][1],plhi_p,plhi3_f2,0,0,0,1,0);
  9579.     initobj(&plhilight[5][1],plhi_p,plhi4_f2,0,0,0,1,0);
  9580.     initobj(&plhilight[0][2],plshad_p,plshad_f,0,0,0,1,0);
  9581.     initobj(&plhilight[1][2],plhi_p,plhi1_f3,0,0,0,1,0);
  9582.     initobj(&plhilight[2][2],plhi_p,plhi2_f3,0,0,0,1,0);
  9583.     initobj(&plhilight[3][2],plhi_p,plhi3_f3,0,0,0,1,0);
  9584.     initobj(&plhilight[4][2],plhi_p,plhi3_f3,0,0,0,1,0);
  9585.     initobj(&plhilight[5][2],plhi_p,plhi4_f3,0,0,0,1,0);
  9586.     initobj(&plhilight[0][3],plshad_p,plshad_f,0,0,0,1,0);
  9587.     initobj(&plhilight[1][3],plhi_p,plhi1_f4,0,0,0,1,0);
  9588.     initobj(&plhilight[2][3],plhi_p,plhi2_f4,0,0,0,1,0);
  9589.     initobj(&plhilight[3][3],plhi_p,plhi3_f4,0,0,0,1,0);
  9590.     initobj(&plhilight[4][3],plhi_p,plhi3_f4,0,0,0,1,0);
  9591.     initobj(&plhilight[5][3],plhi_p,plhi4_f4,0,0,0,1,0);
  9592.     initobj(&plhilight[0][4],plshad_p,plshad_f,0,0,0,1,0);
  9593.     initobj(&plhilight[1][4],plhi_p,plhi1_f5,0,0,0,1,0);
  9594.     initobj(&plhilight[2][4],plhi_p,plhi2_f5,0,0,0,1,0);
  9595.     initobj(&plhilight[3][4],plhi_p,plhi3_f5,0,0,0,1,0);
  9596.     initobj(&plhilight[4][4],plhi_p,plhi3_f5,0,0,0,1,0);
  9597.     initobj(&plhilight[5][4],plhi_p,plhi4_f5,0,0,0,1,0);
  9598.     initobj(&plhilight[0][5],plshad_p,plshad_f,0,0,0,1,0);
  9599.     initobj(&plhilight[1][5],plhi_p,plhi1_ff,0,0,0,1,0);
  9600.     initobj(&plhilight[2][5],plhi_p,plhi2_ff,0,0,0,1,0);
  9601.     initobj(&plhilight[3][5],plhi_p,plhi3_ff,0,0,0,1,0);
  9602.     initobj(&plhilight[4][5],plhi_p,plhi3_ff,0,0,0,1,0);
  9603.     initobj(&plhilight[5][5],plhi_p,plhi4_ff,0,0,0,1,0);
  9604.  
  9605.     // Set ball
  9606.     initobj(&ball,footy_p,footy_f,640,0,-400,1,0);
  9607.  
  9608.     // Set ball shadow 
  9609.     initobj(&ballshad,ballshad_p,ballshad_f,640,0,-400,1,0);
  9610.     
  9611.     // Set pitch lines
  9612.     initobj(&l1,l1_p1,l_f1a,210,0,-200,1,0);
  9613.     initobj(&l2,l2_p1,l_f1a,1070,0,-200,1,0);
  9614.     initobj(&l3,l3_p1,l_f1a,1070,0,-600,1,0);
  9615.     initobj(&l4,l4_p1,l_f1a,210,0,-600,1,0);
  9616.     initobj(&l5,l5_p1,l_f3a,640,0,-200,1,0);
  9617.     initobj(&l6,l6_p1,l_f3a,640,0,-600,1,0);
  9618.     initobj(&circle,circle_pa,circle_fa,640,0,-400,1,0);
  9619.     initobj(&semi1,s_circle_p1a,s_circle_f1a,123,0,-400,1,0);
  9620.     initobj(&semi2,s_circle_p2a,s_circle_f2a,1157,0,-400,1,0);
  9621.     initobj(&spot1,spot_p,spot_f,640,0,-400,1,0);
  9622.     initobj(&spot2,spot_p,spot_f,128,0,-400,1,0);
  9623.     initobj(&spot3,spot_p,spot_f,1152,0,-400,1,0);
  9624.  
  9625.     // Set goals
  9626.     initobj(&goal1_1,goal1a_p,goal_f1a,0,0,-443.5,1,0);
  9627.     initobj(&goal2_1,goal1a_p,goal_f1a,0,0,-356.5,1,0);
  9628.     initobj(&goal3_1,goal1a_p,goal_f1a,0,37,-400,1,0);
  9629.     initobj(&goal4_1,goal1a_p,goal_f1a,-28,0,-400,1,0);
  9630.     initobj(&goal1_2,goal1a_p,goal_f1a,1280,0,-443.5,1,0);
  9631.     initobj(&goal2_2,goal1a_p,goal_f1a,1280,0,-356.5,1,0);
  9632.     initobj(&goal3_2,goal1a_p,goal_f1a,1280,37,-400,1,0);
  9633.     initobj(&goal4_2,goal1a_p,goal_f1a,1308,0,-400,1,0);
  9634.  
  9635.     // Set flags
  9636.     initobj(&flag_1,flag_p,flag_f,0,0,0,1,0);
  9637.     initobj(&flag_2,flag_p,flag_f,1280,0,0,1,0);
  9638.     initobj(&flag_3,flag_p,flag_f,0,0,-800,1,0);
  9639.     initobj(&flag_4,flag_p,flag_f,1280,0,-800,1,0);
  9640.  
  9641.     // Set stands
  9642.     initobj(&stad1,stad1_p,stad1_f, stadlist[setup.stadium].s1x,stadlist[setup.stadium].s1y,stadlist[setup.stadium].s1z,1,0);
  9643.     initobj(&stad2,stad2_p,stad2_f, stadlist[setup.stadium].s2x,stadlist[setup.stadium].s2y,stadlist[setup.stadium].s2z,1,0);
  9644.     initobj(&stad3,stad3_p,stad3_f, stadlist[setup.stadium].s3x,stadlist[setup.stadium].s3y,stadlist[setup.stadium].s3z,1,0);
  9645.     initobj(&stad4,stad4_p,stad4_f, stadlist[setup.stadium].s4x,stadlist[setup.stadium].s4y,stadlist[setup.stadium].s4z,1,0);
  9646.     stp=stad1_f;
  9647.     i=*stp++;
  9648.     for(;i;i--)
  9649.     {
  9650.         j=*stp++;
  9651.         if (*stp<0) *stp-=S_TM-1;
  9652.         stp++;
  9653.         for (;j;j--) stp++;
  9654.     }
  9655.     stp=stad2_f;
  9656.     i=*stp++;
  9657.     for(;i;i--)
  9658.     {
  9659.         j=*stp++;
  9660.         if (*stp<0) *stp-=S_TM-1;
  9661.         stp++;
  9662.         for (;j;j--) stp++;
  9663.     }
  9664.     stp=stad3_f;
  9665.     i=*stp++;
  9666.     for(;i;i--)
  9667.     {
  9668.         j=*stp++;
  9669.         if (*stp<0) *stp-=S_TM-1;
  9670.         stp++;
  9671.         for (;j;j--) stp++;
  9672.     }
  9673.     stp=stad4_f;
  9674.     i=*stp++;
  9675.     for(;i;i--)
  9676.     {
  9677.         j=*stp++;
  9678.         if (*stp<0) *stp-=S_TM-1;
  9679.         stp++;
  9680.         for (;j;j--) stp++;
  9681.     }
  9682.  
  9683.     MCGA_buff[0].buff_start=scrb+320+((320-MCGA_buff[0].clip_wid)>>1)+((200-MCGA_buff[0].clip_hgt)>>1)*320;
  9684.     scrmode=0x13;
  9685.     scrmode3DB=-1;
  9686.     VGAmode(scrmode);
  9687.     main_buff=MCGA_buff[0];
  9688.     for (i=0;i<768;i++) pal[i]=0;
  9689.     setpal();
  9690.  
  9691.     plyrwr=plyr;            
  9692.     for (i=0;i<11;i++)
  9693.         {
  9694.         plyrwr->x=640;
  9695.         plyrwr->y=0;
  9696.         plyrwr->z=400;
  9697.         plyrwr->type=1;
  9698.         plyrwr->number=i+1;
  9699.         plyrwr->htype=plyrwr->hcol=0;
  9700.         plyrwr->crot=1;
  9701.         plyrwr->srot=0;
  9702.         plyrwr->anim=0;
  9703.         plyrwr->frame=0;
  9704.         plyrwr->fstep=0.5;
  9705.         plyrwr->sprite=-1;
  9706.         plyrwr++;
  9707.         }
  9708.  
  9709.     for (i=0;i<11;i++)
  9710.         {
  9711.         plyrwr->x=640;
  9712.         plyrwr->y=0;
  9713.         plyrwr->z=400;
  9714.         plyrwr->type=2;
  9715.         plyrwr->number=i+1;
  9716.         plyrwr->htype=plyrwr->hcol=0;
  9717.         plyrwr->crot=1;
  9718.         plyrwr->srot=0;
  9719.         plyrwr->anim=0;
  9720.         plyrwr->frame=0;
  9721.         plyrwr->fstep=0.5;
  9722.         plyrwr->sprite=-1;
  9723.         plyrwr++;
  9724.         }
  9725.  
  9726.     plyrwr->x=640;
  9727.     plyrwr->y=0;
  9728.     plyrwr->z=400;
  9729.     plyrwr->type=3;
  9730.     plyrwr->number=i+1;
  9731.     plyrwr->htype=plyrwr->hcol=0;
  9732.     plyrwr->crot=1;
  9733.     plyrwr->srot=0;
  9734.     plyrwr->anim=0;
  9735.     plyrwr->frame=0;
  9736.     plyrwr->fstep=0.5;
  9737.     plyrwr->sprite=-1;
  9738.     plyrwr++;
  9739.  
  9740.     for (i=0;i<2;i++)
  9741.         {
  9742.         plyrwr->x=640;
  9743.         plyrwr->y=0;
  9744.         plyrwr->z=400;
  9745.         plyrwr->type=4;
  9746.         plyrwr->number=i+1;
  9747.         plyrwr->htype=plyrwr->hcol=0;
  9748.         plyrwr->crot=1;
  9749.         plyrwr->srot=0;
  9750.         plyrwr->anim=0;
  9751.         plyrwr->frame=0;
  9752.         plyrwr->fstep=0.5;
  9753.         plyrwr->sprite=-1;
  9754.         plyrwr++;
  9755.         }
  9756.  
  9757.     plyrwr->x=640;
  9758.     plyrwr->y=20;
  9759.     plyrwr->z=400;
  9760.      plyrwr->crot=1;
  9761.      plyrwr->srot=0;
  9762.      plyrwr->frame=1;
  9763.      plyrwr->fstep=0;
  9764.     plyrwr->sprite=-1;
  9765.     plyrwr++;
  9766.  
  9767.     performance=0;
  9768.     sosTIMERInitSystem(_TIMER_DOS_RATE,_SOS_DEBUG_NORMAL);
  9769.     sosTIMERRegisterEvent(100,timetest,&TimerHandle);
  9770.  
  9771.     for (i=0;i<20;i++)
  9772.         {
  9773.         render3d(&main_buff,0,20,0,1280,20,800,256,plyr,dp,NULL);
  9774.         main_buff.dump(0,0);
  9775.         }
  9776.  
  9777.     sosTIMERRemoveEvent(TimerHandle);
  9778.     sosTIMERUnInitSystem(0);
  9779.     performance=2000/performance;
  9780.  
  9781.     for (i=0;i<mappages+noloop+2;i++)
  9782.         {
  9783.         if (freeselector(mapsel[i]) < 0)
  9784.             {
  9785.             puts("Error freeing selectors");
  9786.             exit(3);
  9787.             }
  9788.         }
  9789.  
  9790.     freex(rotlist);
  9791.     freex(ptslist);
  9792.     freex(pollist);
  9793.     freex(objlist);
  9794.     freex(plyrtwtb);
  9795.     freex(player_p);
  9796.     freex(filters);
  9797.     freex(textures);
  9798.     freex(sky);
  9799.     freex(scrb);
  9800.     freex(maps);
  9801.  
  9802.     timeit=0;
  9803.  
  9804. //    return (performance);
  9805.     return (31);
  9806.     }
  9807.  
  9808.  
  9809.  
  9810. /****************/
  9811. /* JUGGLING MAN */
  9812.  
  9813. float balla;
  9814. float balld;
  9815. float ballly;
  9816. float ballld;
  9817. int jno;
  9818.  
  9819. void drawman(buff_info *buffer, float anim, float angle, int dist)
  9820.     {
  9821.     datapt targx,targy,targz,viewx,viewy,viewz,vdist;
  9822.  
  9823.     short i,j;
  9824.     objs *oldobj;
  9825.     double hr,r;
  9826.     mat tmp;
  9827.  
  9828.     targx=targz=0;
  9829.     targy=10;
  9830.     viewx=dist*cos(angle);
  9831.     viewy=40;
  9832.     viewz=dist*sin(angle);
  9833.     vdist=buffer->buff_wid;
  9834.  
  9835.     // Set extended buffer info
  9836.     render_buff.buff_start=buffer->buff_start;
  9837.     render_buff.buff_wid=buffer->buff_wid;
  9838.     render_buff.buff_hgt=buffer->buff_hgt;
  9839.     render_buff.clip_wid=buffer->clip_wid;
  9840.     render_buff.clip_hgt=buffer->clip_hgt;
  9841.     render_buff.scale_x=buffer->scale_x;
  9842.     render_buff.scale_y=buffer->scale_y;
  9843.     render_buff.dump=buffer->dump;
  9844.     render_buff.clip_endl=buffer->buff_start+buffer->clip_hgt*buffer->buff_wid;
  9845.     render_buff.clip_end=render_buff.clip_endl-buffer->buff_wid;
  9846.     render_buff.clip_widl=buffer->clip_wid-1;
  9847.     render_buff.clip_hgtl=buffer->clip_hgt-1;
  9848.     render_buff.clip_xmid=buffer->clip_wid>>1;
  9849.     render_buff.clip_ymid=buffer->clip_hgt>>1;
  9850.  
  9851.     // Set perspective based info
  9852.     oq=vdist;
  9853.     q=vdist*((buffer->scale_x+buffer->scale_y)/2);
  9854.     qr=(floatpt)1/q; 
  9855.     qa=(floatpt)q*2/100;
  9856.     scrdr=(float)1/SCREENDIST;
  9857.     persc=q*scrdr;
  9858.  
  9859.     // Prepare viewing vector vars
  9860.     viewz=-viewz,targz=-targz;
  9861.     targx-=viewx;
  9862.     targy-=viewy;
  9863.     targz-=viewz;
  9864.  
  9865.     hr=targx*targx+targz*targz;
  9866.     if (hr<1) hr=1,targz=1;
  9867.     r=sqrt(hr+targy*targy);
  9868.     hr=sqrt(hr);
  9869.     cth=targz/hr;sth=targx/hr;
  9870.     cph=hr/r;sph=targy/r;
  9871.  
  9872.     // Make global rotation matrix
  9873.     matcop(rot.arr,unit);
  9874.     matcop(tran.arr,unit);
  9875.     matcop(tmp,unit);
  9876.     rot.arr[0][3]=-viewx;
  9877.     rot.arr[1][3]=-viewy;
  9878.       rot.arr[2][3]=-viewz;
  9879.     tmp[0][0]=cth;
  9880.     tmp[0][2]=-sth;                             
  9881.     tmp[1][0]=-sth*sph;
  9882.     tmp[1][1]=cph;
  9883.     tmp[1][2]=-cth*sph;
  9884.     tmp[2][0]=sth*cph;             
  9885.     tmp[2][1]=sph;
  9886.     tmp[2][2]=cth*cph;
  9887.     matmul(rot.arr,tmp);
  9888.  
  9889.     clearlists
  9890.  
  9891.     player[0].points=player_p[(short)(anim*jno)];
  9892.     oldobj=curobj;
  9893.     addobjy(&player[0]);
  9894.     if (oldobj!=curobj) sortobj(oldobj);
  9895.  
  9896.     ball.y=-player[0].points[1+23*3];
  9897.     ball.z=player[0].points[1+23*3+2];
  9898.     ball.x=-ball.y*player[0].crot+ball.z*player[0].srot+player[0].x;
  9899.     ball.z=ball.y*player[0].srot+ball.z*player[0].crot+player[0].z;
  9900.     ball.y=player[0].points[1+23*3+1]+player[0].y;
  9901.     addobjxy(&ball,cos(balla),sin(balla));
  9902.  
  9903.     if (anim<0.88)
  9904.         {
  9905.         balla+=balld;
  9906.         balld*=0.89;
  9907.         if (ball.y-ballly>0 && ballld<=0) balld+=0.16;
  9908.         ballld=ball.y-ballly;
  9909.         ballly=ball.y;
  9910.         }
  9911.  
  9912.     dispols();
  9913.  
  9914.     }
  9915.  
  9916. int initman(int team, int capture)
  9917.     {
  9918.     int i,nheadfile;
  9919.     word selector;
  9920.     BYTE *seg;
  9921.     BYTE *tptr;
  9922.  
  9923.     if ( (maps=(mappage *)mallocx((mappages=4)*65536)) == NULL ) goto err1;
  9924.     if ( (textures=(texture *)mallocx(600*sizeof(texture))) == NULL ) goto err2;
  9925.     if ( (player_p=(capfrm *)mallocx(300*sizeof(capfrm))) == NULL ) goto err3;
  9926.     if ( (objlist=(objs *)mallocx(5*sizeof(objs))) == NULL ) goto err4;
  9927.     if ( (pollist=(pols *)mallocx(60*sizeof(pols))) == NULL ) goto err5;
  9928.     if ( (ptslist=(scrpt *)mallocx(400*10*sizeof(scrpt))) == NULL ) goto err6;
  9929.     if ( (rotlist=(rotpt *)mallocx(200*4*sizeof(rotpt))) == NULL ) goto err7;
  9930.  
  9931.       if (readrawfile(dataoffs,(BYTE *)load_offsets) == NULL) goto err8;
  9932.     if (opendatafile(datafile)<0) return(-1);
  9933.  
  9934. #ifndef BBS
  9935.     if (teamlist[team].headfile==BM_XCAUCASB || teamlist[team].headfile==BM_XNORDIC)
  9936.         nheadfile=BM_XCAUCASA;
  9937.     else
  9938. #endif
  9939.         nheadfile=teamlist[team].headfile;
  9940.  
  9941.     if (
  9942.         readfile(TMD_MANDATA,(BYTE *)&textures[1]) == NULL ||
  9943.        readfile(PAL_FOOTY,pal) == NULL ||
  9944.        readfile(nheadfile,maps[0]) == NULL ||
  9945.        readfile(teamlist[team].torsofile,maps[1]) == NULL ||
  9946.        readfile(teamlist[team].limbsfile,maps[3]) == NULL ||
  9947.        readfile(BM_FEET,maps[3]+158*256) == NULL ||
  9948.        readfile(teamlist[team].palfile,&pal[3*32]) == NULL ||
  9949.           readfile(teamlist[team].skinfile,&pal[3*80]) == NULL
  9950.         )
  9951.         goto err8;
  9952.     switch(capture)
  9953.         {
  9954.         case 0:
  9955.             if (readfile(MPB_JUGGLE,(BYTE *)&player_p[0]) == NULL) goto err8;
  9956.             jno=300;
  9957.             break;
  9958.         case 1:
  9959.             if (readfile(MPB_CELEB,(BYTE *)&player_p[0]) == NULL) goto err8;
  9960.             jno=118;
  9961.             break;
  9962.         }
  9963.     closedatafile();
  9964.  
  9965.     tptr=maps[0];
  9966.     for (i=0;i<4*65536;i++) ++(*tptr++);
  9967.  
  9968.     if ((selector=getselectors(mappages)) < 0)
  9969.         {
  9970.         puts("Error preparing selectors");
  9971.         goto err8;
  9972.         }
  9973.     for (i=0;i<mappages;i++)
  9974.         {
  9975.         mapsel[i]=selector;
  9976.         seg=maps[i];
  9977.         if (setselector(selector,seg,65536) < 0)
  9978.             {
  9979.             puts("Error setting selectors");
  9980.             goto err9;
  9981.             }
  9982.         selector+=nextselectordisp(selector);
  9983.         }
  9984.  
  9985.     initobj(&player[0],player_p[0],player_f1,0,0,0,1,0);
  9986.     player[0].faces[0]=12;
  9987.     initobj(&ball,footy_p,footy_f,0,0,0,1,0);
  9988.  
  9989.     balla=0;
  9990.     balld=0;
  9991.     ballly=0;
  9992.     ballld=0;
  9993.  
  9994. //    setpal();
  9995. //    testVESA=0;
  9996. //    scrmode=VESAmode(&modelist[0]);
  9997.     return (0);
  9998.  
  9999.     err9:;
  10000.     for (i=0;i<mappages;i++)
  10001.         freeselector(mapsel[i]);
  10002.     err8:;
  10003.     freex(rotlist);
  10004.     err7:;
  10005.     freex(ptslist);
  10006.     err6:;
  10007.     freex(pollist);
  10008.     err5:;
  10009.     freex(objlist);
  10010.     err4:;
  10011.     freex(player_p);
  10012.     err3:;
  10013.     freex(textures);
  10014.     err2:;
  10015.     freex(maps);
  10016.     err1:;
  10017.     return (-1);
  10018.  
  10019.     }
  10020.  
  10021.  
  10022. void endman()
  10023.     {
  10024.     int i;
  10025.     for (i=0;i<mappages;i++)
  10026.         {
  10027.         if (freeselector(mapsel[i]) < 0)
  10028.             {
  10029.             puts("Error freeing selectors");
  10030.             exit(3);
  10031.             }
  10032.         }
  10033.     freex(rotlist);
  10034.     freex(ptslist);
  10035.     freex(pollist);
  10036.     freex(objlist);
  10037.     freex(player_p);
  10038.     freex(textures);
  10039.     freex(maps);
  10040.     }
  10041.  
  10042. 
  10043.